检查行是否存在与MySQL
我需要帮助检查行是否存在。 我得到“电子邮件不再存在publisher@example.com”。
有没有更好的方法来检查行是否存在与mysqli?
if (count($_POST)) { $email = $dbl->real_escape_string(trim(strip_tags($_POST['email']))); $passwd = $dbl->real_escape_string(trim(strip_tags($_POST['passwd']))); $query = "SELECT `email` FROM `tblUser` WHERE `email` = '$email'"; $result = mysqli_query($dbl,$query); if(is_resource($result) && mysqli_num_rows($result) == 1 ){ $row = mysqli_fetch_assoc($result); echo $email . " email exists " . $row["email"] . "\n"; } else{ echo "email no longer exists" . $email . "\n"; } }
以下是经过尝试,testing和validation的方法来检查行是否存在。
(其中一些我自己使用,或者过去使用过)。
编辑:我在我使用mysqli_query()
两次的语法中犯了一个以前的错误。 请参考修订版。
即:
if (!mysqli_query($con,$query))
应该简单的读取if (!$query)
。
- 我很抱歉忽视这个错误。
附注:两个'".$var."'
和'$var'
做同样的事情。 你可以使用任何一个,都是有效的语法。
这里是两个编辑的查询:
$query = mysqli_query($con, "SELECT * FROM emails WHERE email='".$email."'"); if (!$query) { die('Error: ' . mysqli_error($con)); } if(mysqli_num_rows($query) > 0){ echo "email already exists"; }else{ // do something }
在你的情况下:
$query = mysqli_query($dbl, "SELECT * FROM `tblUser` WHERE email='".$email."'"); if (!$query) { die('Error: ' . mysqli_error($dbl)); } if(mysqli_num_rows($query) > 0){ echo "email already exists"; }else{ // do something }
您也可以使用mysqli_
和一个准备好的语句方法:
$query = "SELECT `email` FROM `tblUser` WHERE email=?"; if ($stmt = $dbl->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; } } }
或者使用准备好的语句的PDO方法 :
<?php $email = $_POST['email']; $mysql_hostname = 'xxx'; $mysql_username = 'xxx'; $mysql_password = 'xxx'; $mysql_dbname = 'xxx'; try { $conn= new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", $mysql_username, $mysql_password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { exit( $e->getMessage() ); } // assuming a named submit button if(isset($_POST['submit'])) { try { $stmt = $conn->prepare('SELECT `email` FROM `tblUser` WHERE email = ?'); $stmt->bindParam(1, $_POST['email']); $stmt->execute(); while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { } } catch(PDOException $e) { echo 'ERROR: ' . $e->getMessage(); } if($stmt->rowCount() > 0){ echo "The record exists!"; } else { echo "The record is non-existant."; } } ?>
- 准备好的语句最好用来帮助防止SQL注入。
注意:
当处理上面使用/列出的表单和POST数组时,请确保POST数组包含值,对于表单使用POST方法,并匹配input的命名属性。
- 仅供参考:如果不明确指示,表单默认为GET方法。
注意: <input type = "text" name = "var">
– $_POST['var']
匹配。 $_POST['Var']
不匹配。
- POST数组区分大小写。
请教:
检查参考时出错:
- http://php.net/manual/en/function.error-reporting.php
- http://php.net/manual/en/mysqli.error.php
- http://php.net/manual/en/pdo.error-handling.php
请注意,MySQL API不会混杂在一起,以防您可能正在访问此问答,并且正在使用mysql_
连接(和查询)。
- 您必须使用相同的连接来查询。
请参考以下内容:
- 我可以在PHP中混合使用MySQL API吗?
如果您正在使用mysql_
API并且没有select使用它,请参阅以下关于堆栈的问答:
- MySql php:检查行是否存在
mysql_*
函数已被弃用,并将从未来的PHP版本中删除。
- 现在是进入21世纪的时候了。
你也可以给(a)行添加一个UNIQUE约束。
参考文献:
- http://dev.mysql.com/doc/refman/5.7/en/constraint-primary-key.html
- http://dev.mysql.com/doc/refman/5.7/en/alter-table.html
- 如何检查一个值是否已经存在以避免重复?
- 如何为现有表添加唯一键(非唯一行)
您必须执行您的查询,并在查询中添加单引号到$ email,因为它是一个string,并删除is_resource($query)
$查询是一个string,$结果将是资源
$query = "SELECT `email` FROM `tblUser` WHERE `email` = '$email'"; $result = mysqli_query($link,$query); //$link is the connection if(mysqli_num_rows($result) > 0 ){....}
UPDATE
基于你的编辑只是改变:
if(is_resource($query) && mysqli_num_rows($query) > 0 ){ $query = mysqli_fetch_assoc($query); echo $email . " email exists " . $query["email"] . "\n";
通过
if(is_resource($result) && mysqli_num_rows($result) == 1 ){ $row = mysqli_fetch_assoc($result); echo $email . " email exists " . $row["email"] . "\n";
你会没事的
更新2
一个更好的方法应该是有一个存储过程执行以下SQL传递电子邮件作为参数
SELECT IF( EXISTS ( SELECT * FROM `Table` WHERE `email` = @Email) , 1, 0) as `Exist`
并在php中检索值
Pseudocodigo:
$query = Call MYSQL_SP($EMAIL); $result = mysqli_query($conn,$query); $row = mysqli_fetch_array($result) $exist = ($row['Exist']==1)? 'the email exist' : 'the email doesnt exist';
在validation之后,在INSERT之前检查用户名是否已经存在,使用mysqli(程序)。 这工作:
//check if username already exists include 'phpscript/connect.php'; //connect to your database $sql = "SELECT username FROM users WHERE username = '$username'"; $result = $conn->query($sql); if($result->num_rows > 0) { $usernameErr = "username already taken"; //takes'em back to form } else { // go on to INSERT new record