1

当我在没有“准备”和“执行”的情况下获取数据时,代码工作正常。例子:

$this->db->query("select {$val} from {$table_name} where username={$username}")->fetch();

但是这段代码总是返回False

$this->db->prepare("select :val from :table_name where username = :username")
->execute(array(':username'=>$username,':val'=>$val,':table_name'=>$this->table_name));

帮助!:(

谢谢您的回答。现在我的代码在这里:

$q=$this->db->prepare("select pass from nm_users where username = :username");
return $q->execute(array('username'=>$username));

返回值为True,但我无法从数据库中获取数据。

4

3 回答 3

2

不要尝试将 PDO 用作流畅的接口。你不能这样做:

$db->prepare()->execute();

原因是流式接口只有在保证函数返回一个在这种情况下具有执行方法的对象时才起作用。

但是 prepare() 返回false错误。该值false不是对象,也没有 execute() 方法。

您需要false在每次prepare() 和每次execute() 后检查:

$stmt = $this->db->prepare("select :val from :table_name where username = :username");
if ($stmt === false) {
  $err = $this->db->errorInfo();
  error_log($err[2]);
}
$result = $stmt->execute(array(':username'=>$username,':val'=>$val,':table_name'=>$this->table_name));
if ($result === false) {
  $err = $stmt->errorInfo();
  error_log($err[2]);
}

如果你这样做,你会发现你的 prepare() 报告了一个错误:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ''user' where username = 'bill'' 附近使用正确的语法

原因是查询参数仅用于常量值。您不能将它们用于表名、列名、SQL 关键字、表达式、值列表等。

我推断这:val也意味着是一个动态列名,这也是不允许的。但在这种情况下,它不会导致错误,它只会用$val返回的每一行的值替换一个文字字符串。

换句话说,用参数替换表名是错误的,因为你不能像 SELECT * FROM 'user'(文字字符串,而不是表名)那样进行查询,这就是参数的作用。这只是无效的 SQL。

但是动态列名会进行类似的查询SELECT 'val' FROM ...,这是合法的,但不会从名为 val 的列中选择,它会选择文字字符串常量“val”。

于 2013-02-17T17:44:27.353 回答
0

不能为表名等设置参数,并且必须在没有冒号的数组中设置:

$dbSelect=$db->prepare("select aField from aTable where username = :username")
$dbSelect->execute(array('username' => $username));

用标准或类似的东西替换aField和。aTablestr_replace

于 2013-02-17T17:52:41.480 回答
-1

当您“准备”它时,表名必须包含在查询中,它不能作为其余参数动态添加。因此,您必须结合使用两种策略来完成查询:

$stmnt=sprintf('select %1$s from %2$s where username=:username',
               $val, $this->table_name);
if (FALSE===($query=$this->db->prepare($stmnt)))
    exit('Buggy statement: '.$stmnt);
$query->execute(array(':username'=>$username));

不幸的是,这也意味着您必须小心$this->table_name正确转义!

于 2013-02-17T17:43:13.547 回答