我需要帮助检查是否存在行。我收到“电子邮件不再存在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";
}
}
答案 0 :(得分:62)
以下是经过试验,测试和验证的方法,用于检查是否存在行。
(其中一些我自己使用,或过去曾使用过。)
编辑:我在语法中犯了一个错误,我曾两次使用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_
with a prepared statement方法:
$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;
}
}
}
Or a PDO method with a prepared statement:
<?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.";
}
}
?>
<强> N.B:强>
在处理上面使用/概述的表单和POST数组时,请确保POST数组包含值,POST方法用于表单并匹配输入的命名属性。
注意:<input type = "text" name = "var">
- $_POST['var']
匹配。 $_POST['Var']
不匹配。
咨询:
检查引用时出错:
请注意,MySQL API不会混用,如果您可能正在访问此问答并且您正在使用mysql_
进行连接(并查询)。
请参阅以下内容:
如果您使用的是mysql_
API并且无法使用它,请参阅以下有关堆栈的问答:
{@ 1}}函数已弃用,将从以后的PHP版本中删除。
您还可以为(a)行添加UNIQUE约束。
参考文献:
答案 1 :(得分:8)
您必须执行查询并在查询中将单引号添加到$ email,因为它是一个字符串,并删除is_resource($query)
$查询是一个字符串,$ result将是资源
$query = "SELECT `email` FROM `tblUser` WHERE `email` = '$email'";
$result = mysqli_query($link,$query); //$link is the connection
if(mysqli_num_rows($result) > 0 ){....}
<强>更新强>
您的编辑基础只需更改:
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';
答案 2 :(得分:4)
验证之后和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
答案 3 :(得分:2)
有多种方法可以检查数据库中是否存在值。让我演示一下如何使用PDO和mysqli正确完成此操作。
PDO是更简单的选项。要确定数据库中是否存在值,可以使用预处理语句和fetchColumn()
。无需获取任何数据,因此,如果值存在,我们将仅获取1
。
<?php
// Connection code.
$options = [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new \PDO('mysql:host=localhost;port=3306;dbname=test;charset=utf8mb4', 'testuser', 'password', $options);
// Prepared statement
$stmt = $pdo->prepare('SELECT 1 FROM tblUser WHERE email=?');
$stmt->execute([$_POST['email']]);
$exists = $stmt->fetchColumn(); // either 1 or null
if ($exists) {
echo 'Email exists in the database.';
} else {
// email doesn't exist yet
}
有关更多示例,请参见:How to check if email exists in the database?
和往常一样,mysqli有点麻烦且受限制,但是我们可以使用类似的方法编写预备语句。
<?php
// Connection code
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new \mysqli('localhost', 'testuser', 'password', 'test');
$mysqli->set_charset('utf8mb4');
// Prepared statement
$stmt = $mysqli->prepare('SELECT 1 FROM tblUser WHERE email=?');
$stmt->bind_param('s', $_POST['email']);
$stmt->execute();
$exists = (bool) $stmt->get_result()->fetch_row(); // Get the first row from result and cast to boolean
if ($exists) {
echo 'Email exists in the database.';
} else {
// email doesn't exist yet
}
您也可以获取COUNT(1)
并使用fetch_row()[0]
从第一行中读取第一项,而不是将结果行(可能甚至不存在)都强制转换为布尔值。
有关更多示例,请参见:How to check whether a value exists in a database using mysqli prepared statements
mysqli_num_rows()
,请不要听他们的话。这是一种非常糟糕的方法,如果使用不当,可能会导致性能问题。 real_escape_string()
。这并不意味着可以防止SQL注入。如果正确使用准备好的语句,则无需担心任何转义。