【问题标题】:PHP PDO Prepared Statement Query not substitutingPHP PDO准备好的语句查询不替换
【发布时间】:2011-12-05 21:23:23
【问题描述】:

我有一小段 PHP 代码:

$stm = $db->prepare($sql);
$result = $stm->execute($params);

$params 如下

array(1) {
  [0]=>
  string(3) "why"
}

但是,根据 MySQL 日志,发送到 MySQL 的 $sql 仍然包含一个问号:

1 Query SELECT a.* FROM article a
LEFT JOIN article_links al on a.id = al.from_article_id
WHERE al.to_article = '?'

还有什么我缺少的替代品吗?

【问题讨论】:

  • $sql 问号是否有单引号?如果是这样,请删除它们!

标签: php mysql pdo prepared-statement


【解决方案1】:

你不需要在问号两边加上单引号:

SELECT a.* FROM article a
LEFT JOIN article_links al on a.id = al.from_article_id
WHERE al.to_article = ?;

【讨论】:

  • 谢谢。但是,这提出了一个问题,PHP 如何知道我是否需要在我的 SQL 查询中使用引号?例如,在这种情况下,to_article 是一个 varchar,但如果它是一个 int 呢?
  • 如果要定义参数的类型,请使用bindParam,您可以为每个参数指定数据类型。有关更多信息,请参见此处:php.net/manual/en/pdostatement.bindparam.php,如果您需要示例,请告诉我们! :)
  • 应该值得注意的是,即使你在一个 int 周围加上引号,这对 MySQL 来说也没关系,而且 PDO 在后台做了一些魔法
【解决方案2】:

我怀疑这是真的:

$sql = "SELECT a.* FROM article a LEFT JOIN article_links al on a.id = al.from_article_id WHERE al.to_article = '?'"

问号不应该被引号包围——这意味着它是一个字符串而不是一个参数占位符。只使用al.to_article = ?

【讨论】:

  • 谢谢。如上所述,如何在字符串占位符和 int 之间指定?
  • 您通常不需要。如果您愿意,您可以在绑定时进行,而不是在准备时进行。例如。 $preparedstatement->bindValue($param, $val, PDO::PARAM_INT)。默认为PDO::PARAM_STR
猜你喜欢
  • 2011-01-08
  • 2010-11-30
  • 1970-01-01
  • 2010-11-05
  • 2010-12-19
  • 2012-10-27
相关资源
最近更新 更多