我需要帮助检查数据库中是否存在一行。就我而言,该行包含一个电子邮件地址。我得到结果:
email no longer exists [email protected]
这是我当前使用的代码:
if (count($_POST)) {
$email = $dbl->real_escape_string(trim(strip_tags($_POST['email'])));
$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";
}
}
有没有更好的方法来检查 MySQL 数据库中是否存在一行(在我的例子中,检查 MySQL 中是否存在电子邮件)?
使用 mysqli 准备好的语句传统方法:
$query = "SELECT 1 FROM `tblUser` WHERE email=?";
$stmt = $dbl->prepare($query);
$stmt->bind_param("s", $email);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$emailExists = (bool)$row;
使用 mysqli 现代方法盯着 PHP 8.2:
$query = "SELECT 1 FROM `tblUser` WHERE email=?";
$result = $dbl->execute_query($query, [$email]);
$row = $result->fetch_assoc();
$emailExists = (bool)$row;
使用 PDO 准备好的语句:
$email = $_POST['email'];
$stmt = $conn->prepare('SELECT 1 FROM `tblUser` WHERE email = :email');
$stmt->execute(["email" => $_POST['email']]);
$row = $result->fetch();
$emailExists = (bool)$row;
注意:
在处理上面使用/概述的表单和 POST 数组时,请确保 POST 数组包含值、表单使用 POST 方法并为输入匹配命名属性。
注意:
<input type = "text" name = "var">
- $_POST['var']
匹配。 $_POST['Var']
没有匹配。
咨询:
检查参考文献时出错:
请注意,MySQL API 不会混合使用,以防您访问此问答并使用
mysql_
进行连接(并查询)。
有关此问题请参阅以下内容:
如果您正在使用
mysql_
API 并且无法选择使用它,请参阅 Stack 上的以下问答:
mysql_*
函数已弃用,并将从未来的 PHP 版本中删除。
您还可以向(a)行添加UNIQUE约束。
参考资料:
您必须执行查询并向查询中的 $email 添加单引号,因为它是一个字符串,并删除
is_resource($query)
$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 中的值
伪科迪戈:
$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';
有多种方法可以检查数据库中是否存在某个值。让我演示如何使用 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
}
更多示例请参阅:如何检查数据库中是否存在电子邮件?
与往常一样,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]
读取第一行中的第一项,而不是将结果行(甚至可能不存在)转换为布尔值
更多示例请参阅:如何使用 mysqli 准备好的语句检查数据库中是否存在值
mysqli_num_rows()
,请不要听他们的。这是一种非常糟糕的方法,如果滥用可能会导致性能问题。real_escape_string()
。这并不是为了防止 SQL 注入。如果您正确使用准备好的语句,则无需担心任何转义。验证之后和 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