【问题标题】:php mysql prepared statements not workingphp mysql准备好的语句不起作用
【发布时间】:2015-10-11 18:44:59
【问题描述】:

这行得通

$stmt = $conn->prepare("select username from usernames where session" . "1" . " = :session");
$stmt->bindParam(':session', $session);
$stmt->execute();

但这不起作用

$data = "1";
$stmt = $conn->prepare("select username from usernames where session" . ":data" . " = :session");
$stmt->bindParam(':data', $data);
$stmt->bindParam(':session', $session);
$stmt->execute();

我一直在试图找出原因。可以请一些帮助。

我唯一能想到的是我的数据库有 session1 作为字段,但它也有 session2,所以也许我不能使用参数来拆分字段名称?

我一直在用

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

但我只是得到一个空白屏幕 谢谢

【问题讨论】:

  • php.net/manual/en/pdo.error-handling.php 这会告诉你为什么它失败了。
  • 准备好的语句不是字符串连接的某种奇特形式。还有很多事情要做,因此您不能在准备好的语句中使用占位符来表示表名或列名。无论如何,如果您有名为session1session2 等的列,那么您的数据库设计就有缺陷。
  • “但我只是得到一个空白屏幕” => php.net/manual/en/function.error-reporting.php

标签: php mysql pdo


【解决方案1】:

这绝对行不通,因为它会将$data 作为字符串传递,这意味着您实际上会得到where session'1' = 'whatever' 之类的东西。无论如何,我很确定无论如何您都不能以这种方式执行此操作 - 变量用于值,而不是列/表名称。

This question 非常相似,那里的答案看起来很适用——其中一个甚至特别提到了列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 2011-11-10
    • 2014-09-28
    • 1970-01-01
    相关资源
    最近更新 更多