执行PDO查询将绑定参数从整数更改为字符串

时间:2012-07-17 12:31:08

标签: php sql pdo

代码示例

$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

任何人都可以解释为什么会这样吗?

3 个答案:

答案 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);
?>