【问题标题】:Checking results of PDO statement to run a conditional检查 PDO 语句的结果以运行条件
【发布时间】:2015-11-19 21:17:17
【问题描述】:

我也尝试将一个新数字输入到数据库中,只有当它不存在时,为了做到这一点,我正在执行以下操作

if (isset($_POST['Number'])) {
    $number = ($_POST['Number']);
        $NCheck = "SELECT COUNT(*) FROM `DS_Numbers` WHERE `Number` = '$number' ";

    $stmt = $dbCon->prepare($sql);//* prepared statement for result which populates table
    $stmt->execute();
        $result = $stmt->fetchColumn(0);


        if($result > 0){ // if there is a value then block
            $ENumber = "This Number already exists";
            $errors[] = 'error';
     } else {
            echo "number done";// echo statement to see that it has reached this
            $number1 = ($_POST['Number']);
            }
} else {
     $errors[] = 'error';
     $ENumber = "Please enter only digits from 0-9";
}

目前发生的情况是我的 PDO 语句没有返回,所以我的结果值始终为 0,但我的研究都没有表明我有问题

关于我哪里出错的任何建议? 我从页面上的 HTML 表单中获取数字,这方面没有问题。

【问题讨论】:

  • 尝试使用“='{$number}'”
  • 错误报告,会告诉你一个未定义的变量。 (一方面)。这里有很多语法错误。
  • 另外,没有什么要“准备”的;只需做一个简单的query()

标签: php html mysql pdo


【解决方案1】:

首先要注意的是,您是在一个名为 $NCheck 的变量中编写查询,而不是 $sql

所以这一行

$stmt = $dbCon->prepare($sql);

应该是

$stmt = $dbCon->prepare($NCheck);

另外请注意,使用 PDO 的主要优点之一是使用绑定参数,但您并没有这样做,而且您实际上暴露于 SQL 注入,因为您只是在查询中添加您在 POST 中获得的值.

【讨论】:

  • 真的不想承认有几个人错过了,但也会有,感谢您的帮助,之前正在阅读注射,看看我是否可以解决。感谢您进行明显的错误检查。
【解决方案2】:

如果数字在表中必须是唯一的,那么您可能应该在列中添加一个 UNIQUE 约束。然后您可以只插入数字,如果它不是唯一的,数据库将返回“重复键”错误。

如果您使用“check-first-insert-later”方法,您将面临竞争条件;如果两个进程尝试同时插入相同的数字,它们都将同时运行 select,它们都将得到零并尝试插入,这在没有唯一约束的情况下对两者都有效。

【讨论】:

    猜你喜欢
    • 2015-03-20
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多