【问题标题】:PDO Select statement returns false even row exists即使行存在,PDO Select 语句也会返回 false
【发布时间】:2021-07-06 22:09:41
【问题描述】:

我正在编写一个脚本来将大量产品添加到我的数据库中。 它在类别表中搜索产品的类别,如果存在,则获取该类别的 id,依此类推。 但是我的 pdo select 语句从不返回值,它添加了数百个相同的类别.. 我的 pdo 声明是:

    $query = $db->query("SELECT * FROM categories WHERE name = '".$fields[2]."' ")->fetch();
        if ( $query ){
               //Do something
                     }

$fields[2] 变量 %90 的时间返回一个存在于表中的值,但每次此查询都返回 false..

更新 将查询更改为;

    $stmt = $db->prepare('SELECT * FROM categories WHERE name = ? ');
    $stmt->execute([$fields[2]]);
    $query = $stmt->fetch();
    if ( $query ){
//bla bla
     }

仍将每个值添加为新类别

【问题讨论】:

  • 这很容易受到 SQL 注入的攻击。了解如何正确、安全地编写查询。根据您遇到的确切问题,它也可能会解决您缺乏结果的问题。 phpdelusions.net/pdo
  • 正在使用查询变量作为 {$fields[2]} 但我尝试了所有可能的方式.. 并且我从我的 excel 文件中获取值,因此在此脚本中没有 sql 注入的风险顺便说一句:) @ADyson
  • 这取决于 Excel 数据的来源,你不觉得吗?由于输入中的未转义字符,也可能仍然存在意外 sql 语法错误的风险。使用参数化查询只是一个好习惯......永远没有借口不这样做。只要有一条规则,即您不信任任何输入,无论它来自哪里。这样就不会有意外了。修复它,然后看看你是否还有问题
  • @ADyson 我更新了代码,它仍然可以正常工作..
  • 唯一真正的结论是 $fields[2] 与数据库中的任何内容都不匹配。这可能是由于输入或数据库数据中存在奇怪的隐藏字符,或者编码不匹配,或者您连接到错误的数据库副本,或者您的调试在查询时对 $fields[2] 的内容不准确被执行。我们对所有数据和任何配置都视而不见,因此很难确定。您需要一一排除可能的原因。

标签: php mysql pdo


【解决方案1】:

试试这个...

$stmt = $db->prepare('SELECT * FROM categories WHERE name=:f_name');
$stmt->execute(['f_name' => $fields[2]]);
$query = $stmt->fetchColumn();
if ( $query ){
}

【讨论】:

  • $fields[2] 的值来自输入?你在查询之前检查了 $fields[2] 是否为空?
  • 当我输入 print $fields[2] 时它打印出来的不是 null;它打印正确的值
  • 您是否在不使用该变量的情况下使用一些实际值检查了查询?
  • $query = $stmt->fetchColumn();用这个 。这仅用于选择单个字段。
  • 真正的价值不是 fetchcolumn();功能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多