Intereting Posts
Создание rss-канала и некоторые проблемы с Mysql Конфигурация SMTP не работает в производстве Не удалось найти оболочку «https» – вы забыли включить ее при настройке PHP? Ошибка сокета Beanstalk 110: время ожидания подключения Метод заполнения в Laravel не работает? Создание предварительного просмотра шрифта Как установить клиентскую библиотеку PostgreSQL для PHP в Windows с включенным SSL PHP и MySQL Выберите одно значение «Предупреждение: невозможно изменить информацию заголовка» в WordPress 3.6.1 Могу ли я определить PHP_INT_SIZE на 4 байта в 64-битной системе, на которой запущен PHP? Предупреждение: mysqli_num_rows () ожидает, что параметр 1 будет mysqli_result, null указан в Как я могу рассчитать линию тренда в PHP? Альтернатива для переменной $ _SERVER PHP в MSIE Получите смещение часового пояса между двумя часовыми поясами на заданную продолжительность Что произойдет, если я не вызову session_start ()?

Предотвращение дублирования данных, вводимых в базу данных mysql

Я пытаюсь заставить мою службу подписки на электронную почту отклонять электронные письма, которые уже существуют в моей базе данных, поэтому пользователи не подписывают одно и то же письмо дважды. это то, что у меня есть, но не работает, какие-то идеи?

<?php if(!isset($_POST['submit'])) exit(); $vars = array('email'); $verified = TRUE; foreach($vars as $v) { if(!isset($_POST[$v]) || empty($_POST[$v])) { $verified = FALSE; } } if(!$verified) { echo "<p style='color:white; margin-top:25px;'>*Email required*</p>"; exit(); } $email = $_POST['email']; if($_POST['submit']) echo "<p style='color:white; margin-top:25px;'>*Check your inbox* </p>"; // Create connection $con=mysqli_connect("mysql.host","user","password","dbname"); // Check connection if (mysqli_connect_errno($con)) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } $sql="INSERT INTO emails (email) VALUES ('$_POST[email]')"; if (!mysqli_query($con,$sql)) { die('Error: ' . mysqli_error($con)); } $query = mysql_query("SELECT * FROM emails WHERE email='$email'",($con)); if(mysql_num_rows($query) != 1) { echo "email already exists"; // redirect back to form and populate with // data that has already been entered by the user } mysqli_close($con); ?> 

Используйте mysqli_num_rows($query) вместо mysql_num_rows($query)

  $query = mysqli_query($con, "SELECT * FROM emails WHERE email='".$email."'"); if(mysqli_num_rows($query) > 0){ echo "email already exists"; }else{ $sql="INSERT INTO emails (email) VALUES ('".$_POST[email]."')"; if (!mysqli_query($con,$sql)) { die('Error: ' . mysqli_error($con)); } } 

Самый простой способ позволить MySQL отклонить дублированный адрес электронной почты, чтобы сделать поле уникальным ( http://www.w3schools.com/sql/sql_unique.asp )

 ALTER TABLE emails ADD UNIQUE (email) 

Однако MySQL не вернет предупреждение

Как отмечено в других ответах, вы смешиваете функции mysqli и mysql.

например, в обеих этих строках вы используете mysql вместо функций mysqli.

 $query = mysql_query("SELECT * FROM emails WHERE email='$email'",($con)); if(mysql_num_rows($query) != 1) 

Я также считаю, что ваш код легко SQL Injectable.

Вы используете $ _POST ["email"] в своем запросе вставки, не дезинфицируя его.

Посмотрите, по крайней мере, на страницу wikipedia sql injection wikipedia

Во-первых, вы смешиваете MySQLi_ с MySQL_ поэтому придерживайтесь MySQLi_ и соответствующим образом изменяете остальную часть кода.

Это логика, которую я использую в своих сценариях, используя ? вместо '$email'

 $query = $con->query("SELECT * FROM emails WHERE email=?"); // $query = $con->query("SELECT email FROM emails WHERE email=?"); // you may need to use that one --^ if checking a particular column $numrows=mysqli_num_rows($query); if($numrows > 0){ die("Email already exists in the database, please try again."); } 

Вы можете использовать этот метод, параметры привязки. Предполагая, что ваша колонка называется email

 $query = "SELECT email FROM emails WHERE email=?"; if ($stmt = $con->prepare($query)){ $stmt->bind_param("s", $email); if($stmt->execute()){ $stmt->store_result(); $email_check= ""; $stmt->bind_result($email_check); $stmt->fetch(); if ($stmt->num_rows == 1){ echo "That Email already exists."; exit; } } } 

Помимо смешивания mysql и mysli

Используйте> not! =

 if(mysqli_num_rows($query) > 1) 

Но этот подход означает, что у вас уже есть дубликаты.

Возможно, это поможет после того, как вы поместите уникальный индекс в столбец электронной почты.

Мой ответ будет следующим:

Сначала создайте UNIQUE KEY столбца электронной почты, а затем:

 INSERT INTO `table` VALUES (/*etc*/) ON DUPLICATE KEY UPDATE /*set a column equal to itself*/ 

Это позволяет попытаться вставить в базу данных, и вы можете выбрать, вызывает ли запрос ошибку. Если вы хотите, чтобы он выдал ошибку, просто не используйте ON DUPLICATE KEY , а затем поймайте SQLException, которое выбрасывается из запроса, и сообщите пользователю, что почта уже существует.

Добавьте уникальное ограничение в столбец электронной почты.

Проверка на ошибку, возвращаемую при вставке или обновлении. Я считаю, что на код может повлиять, если это первичный ключ, внешний ключ, уникальное ограничение на индекс.

С помощью PHP вы можете использовать

 if( mysql_errno() == X) { // Duplicate VALUE } else { // fail } 

Вы можете проверить его самостоятельно с помощью дубликата электронной почты, или вот возвращаемые значения mysql_errNo

Для не PHP, чтобы определить правильный код ошибки, проверьте его самостоятельно с дублирующимся письмом или посмотрите на следующее.

Ошибки MySQL