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