【问题标题】:PDO BindParam won't bind on while loop every timePDO BindParam 每次都不会在 while 循环上绑定
【发布时间】:2012-12-05 23:06:03
【问题描述】:

我正在通过 PHP 中的 PDO 连接到 SQL Server DB。我的问题是为什么每次 while 循环运行时我都不能将参数绑定到命名位置标记?代码如下:

    public function search($search, $field)
{
    $c = new PDO("sqlsrv:Server=localhost;Database=$this->_db", $this->_user, $this->_pass);

    $sql = "
    SELECT Title 
    FROM Table WHERE 1=1"; 
    //form array of search terms stored in serachArray variable
    $searchArray = explode(' ', $search );
    //count objects in array
    $num_search_terms = count( $searchArray );
    $i = 0;//for search term array (starts at 0)
    $x = 1;//for parameter incrementin (starts at 1)
    while( $i <= ( $num_search_terms -1 ) )
    {
        $sql .= "
        AND $field LIKE :s".$x;
        $stmt = $c->prepare( $sql );

        $currTerm = "%" . $searchArray[ $i ] . "%";

        $stmt->bindParam( ':s'.$x, $currTerm );         

        $i++;
        $x++;
    }

    $stmt->execute();

    while ( $row = $stmt->fetch( PDO::FETCH_OBJ ) )
    {
       print $row->Title;
    }
}

结果集返回空,没有错误。这次搜索肯定会返回数据。当我只输入一个搜索词时,它工作正常。但是,当我输入多个时,我总是没有得到任何结果。

【问题讨论】:

  • 你构建错了。您应该完整地构建查询字符串,然后绑定参数。

标签: php sql pdo


【解决方案1】:

您正在循环内准备每个不完整的查询片段。您应该只准备一次,并且应该准备完整 SQL 查询。

更新:不确定您在哪里查找文档,但bindParam() 手册页有几个示例:

<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>

如果你在循环中这样做,你将不会得到任何有用的东西:

$stmt->bindParam( ':s'.$x, $currTerm );  

...但您之前删除并创建了一个新的$stmt 对象。

【讨论】:

  • 谢谢。那么我可以一次绑定多个参数吗?我正在努力寻找这方面的文档......
  • 哦,对了,我看到了,是的,但我不想单独写出每一个。无论如何循环它以查找所有参数并自动执行它?所以它可以自动执行 ':s1',$s1 等?
  • 您必须调用PDO::prepare 一次 来创建一个 PDOStatement 对象,然后它们会绑定所有您的参数到那个唯一的对象。我的印象是我没有被理解。我的解释中有什么具体的部分可以改进吗?
  • 感谢 Alvaro,您的解释很好。乔纳森这些链接正是我想要的,谢谢。
猜你喜欢
  • 2012-03-31
  • 2023-03-11
  • 2015-03-14
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 2020-11-09
  • 2021-04-01
相关资源
最近更新 更多