代码示例
$query = $this->db->prepare( $sql ); // prepare sql
$query->bindParam( 'start', $start, PDO::PARAM_INT ); // bind start
$query->bindParam( 'end', $end, PDO::PARAM_INT ); // bind end
$query->bindParam( 'language', $this->language ); // bind language
$query->bindValue( 'keyword', "%$keyword%" ); // bind keyword
var_dump( $end );
$query->execute();
var_dump( $end );
输出
int 2
string '2' (length=1)
但是...... 如果我改变了绑定的顺序......
$query = $this->db->prepare( $sql ); // prepare sql
$query->bindParam( 'language', $this->language ); // bind language
$query->bindValue( 'keyword', "%$keyword%" ); // bind keyword
$query->bindParam( 'start', $start, PDO::PARAM_INT ); // bind start
$query->bindParam( 'end', $end, PDO::PARAM_INT ); // bind end
var_dump( $end );
$query->execute();
var_dump( $end );
输出
int 2
int 2
PHP版本:Windows上的5.3.8
任何人都可以解释为什么会这样吗?
答案 0 :(得分:1)
使用PHP 5.3.13进行检查 - 您的代码的两个版本为我提供了:
int 2
string '2' (length=1)
此外,使用bindValue()而不是bindParam()两个版本的代码给了我:
int 2
int 2
P.S。 我更喜欢使用bindValue()而不是将它与bindParam()混合使用。使用bindParam()不会提供任何性能改进。有些人认为在PHP中传递值并通过指针传递就像在C / C ++中一样,但这是错误的思考。使用bindParam()可能会导致在发生错误时很难找到它们。
答案 1 :(得分:0)
尝试使用仿真来准备语句
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
答案 2 :(得分:-1)
我知道之前已经说过了,但我也会写一个注释,因为我认为记住这一点非常重要:
如果使用PDO bindParam以LIKE条件进行搜索,则无法将百分比和引号添加到param占位符%:keyword%
。
这是错误的:
"SELECT * FROM `users` WHERE `firstname` LIKE '%:keyword%'";
CORRECT解决方案就是像这样保留占位符:
"SELECT * FROM `users` WHERE `firstname` LIKE :keyword";
And then add the percentages to the php variable where you store the keyword:
$keyword = "%".$keyword."%";
最后,PDO会在执行查询时自动添加引号,因此您不必担心它们。
所以完整的例子是:
<?php
// Get the keyword from query string
$keyword = $_GET['keyword'];
// Prepare the command
$sth = $dbh->prepare('SELECT * FROM `users` WHERE `firstname` LIKE :keyword');
// Put the percentage sing on the keyword
$keyword = "%".$keyword."%";
// Bind the parameter
$sth->bindParam(':keyword', $keyword, PDO::PARAM_STR);
?>