【问题标题】:Prepared Statements Checking if row exists准备好的语句检查行是否存在
【发布时间】:2020-01-07 16:19:47
【问题描述】:

我是 PHP 中准备好的语句的新手,我想知道如何最好地检查一行是否已经存在,因为我在这个阶段似乎感到困惑:

<?php 
include '../config.php'; 

$stmt = $conn->prepare("INSERT INTO users (email, password) VALUES (?, ?)");
$stmt->bind_param("ss", $email, $password);

if(mysqli_num_rows($stmt) > 0) {
    $email = $_POST['email'];
    $password = $_POST['password'];
    $stmt->execute();
    header('Location: ../login.php');   
} else {
    echo 'user already exists';
}
$stmt->close();
$conn->close();
?>

上面返回else 语句,如果我切换它们,它将再次插入,使用else 语句并插入记录但仍然不检查。

** 更新 **

这是我的更新代码,您可以在下面获得帮助后查看..

<?php 
include '../config.php'; 

ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL);

$email = $_POST['email'];
$password = $_POST['password'];

$stmt_check = $conn->prepare("SELECT * FROM users WHERE email =?");
$stmt_check->bind_param("s", $email);
$stmt_check->execute();
if($stmt_check->num_rows > 0) {
    echo 'user already exists';
} else {
    $stmt = $conn->prepare("INSERT INTO users (email, password) VALUES (?, ?)");
    $stmt->bind_param("ss", $email, $password);
    $stmt->execute();
    // header('Location: ../login.php');
}    
$stmt->close();
$conn->close();
?>

【问题讨论】:

  • 准备好的语句不会改变任何东西。你会完全按照以前的方式来做。参数绑定只是防止SQL注入的工具。
  • 这是我的目标,防止 SQL 注入。
  • 请先检查,有没有返回值再使用条件 $stmt_check->execute(); $stmt_check->store_result(); $countRows = $stmt_check->num_rows;打印 $countRows;死;

标签: php mysqli


【解决方案1】:

mysqli_num_rows 适用于 SELECT 语句。

$stmt_check = $conn->prepare("SELECT * FROM users WHERE email =? AND password =?");
$stmt_check->bind_param("ss", $email, $password);
$stmt_check->execute();
if(mysqli_num_rows($stmt_check) > 0)

更新代码

<?php 

include '../config.php'; 

$email = $_POST['email'];
$password = $_POST['password'];

$stmt_check = $conn->prepare("SELECT * FROM users WHERE email =? AND password =?");
$stmt_check->bind_param("ss", $email, $password);
$stmt_check->execute();
if($stmt_check->num_rows > 0){
  echo 'user already exists';
} else {
  $stmt = $conn->prepare("INSERT INTO users (email, password) VALUES (?, ?)");
  $stmt->bind_param("ss", $email, $password);
  $stmt->execute();
  header('Location: ../login.php');
}

$stmt->close();
$conn->close();
?>

快速链接

哪些州,

此命令仅对像 SELECT 或 SHOW 这样的语句有效 返回一个实际的结果集。检索受影响的行数 通过 INSERT、UPDATE、REPLACE 或 DELETE 查询,使用 mysql_affected_rows().

编辑 1

改变

if(mysqli_num_rows($stmt_check) > 0){

if($stmt_check->num_rows > 0){

参见PHP mysqli_num_rows() Function

Example2

【讨论】:

  • 对不起,我很困惑,你能再解释一下吗?
  • 它仍然使用else 语句。我已经检查并删除了数据库中的所有记录...?
  • @NanaPartykar 我不确定,但是绑定参数后是否缺少$stmt-&gt;execute() 语句?
  • @NanaPartykar 我仍然得到'用户已经存在'......虽然我得到零错误
  • ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); 放入您的脚本中。它将显示错误。然后请发布错误@danjbh 编辑:好点 Loko。没想到。
【解决方案2】:

这是我更新的代码,请尝试

  <?php 

include '../config.php'; 

$email = $_POST['email'];
$password = $_POST['password'];

$stmt_check = $conn->prepare("SELECT * FROM users WHERE email =? AND password =?");
$stmt_check->bind_param("ss", $email, $password);
$stmt_check->execute();
$stmt_check->store_result();
$numberofrows = $stmt_check->num_rows;

if(($numberofrows) > 0)
  echo 'user already exists';
} else {
  $stmt = $conn->prepare("INSERT INTO users (email, password) VALUES (?, ?)");
  $stmt->bind_param("ss", $email, $password);
  $stmt->execute();
  header('Location: ../login.php');
}

$stmt->close();
$conn->close();
?>

【讨论】:

  • 这也将 else 语句返回给我,这里发生了一些可疑的事情..
【解决方案3】:

看看mysqli_stmt_affected_rows()

<?php include '../config.php'; 

$stmt = $conn->prepare("INSERT INTO users (email, password) VALUES (?, ?)");
$stmt->bind_param("ss", $_POST['email'], $_POST['password']);
$stmt->execute();

if(mysqli_stmt_affected_rows($stmt) > 0)
{
    header('Location: ../login.php');   
}
else
{
    echo 'user already exists';
}

$stmt->close();
$conn->close();
?>

【讨论】:

  • 我仍然返回 else 语句,表中没有 100% 的内容可能导致这种情况...?
  • 此代码不起作用,因为您将 $email$password 传递给第一个查询而没有定义它。他将$_POST 部分放在了if 函数中,因此第一个查询将始终不返回任何内容,因为$email$password 为空。
【解决方案4】:
<?php include '../config.php'; 

$stmt = $conn->prepare("INSERT INTO users (email, password) VALUES (?, ?)");
$stmt->bind_param("ss", $_POST['email'], $_POST['password']);
$result = $stmt->execute(); // this return a bool: true if row affected otherwise false

if($result)
{
    header('Location: ../login.php');   
}
else
{
    echo 'user already exists';
}

$stmt->close();
$conn->close();
?>

【讨论】:

  • 这样else语句不会被执行
  • 欢迎来到 Stackoverflow。请对您的代码进行一些解释,以便其他人清楚地理解。
猜你喜欢
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多