PHP PDO LIKE语句不成功

时间:2013-02-20 23:25:31

标签: php mysql pdo

我已经google了很多关于如何使用PDO在mysql中创建搜索的内容,但是我仍然没有成功为自己创建一个。

我在表格的两个字段中搜索同一组关键字。

$str = explode(' ','app ban');
$p_id = 5;
$search_term = '';
$stmt = $db->prepare('SELECT id from the_table WHERE p_id=:p_id AND (name LIKE :search_term1 OR text LIKE :search_term2)');
$stmt->bindValue(':p_id',$p_id, PDO::PARAM_INT);
$stmt->bindValue(':search_term1',$search_term, PDO::PARAM_STR);
$stmt->bindValue(':search_term2',$search_term, PDO::PARAM_STR);
foreach($str as $key => $value)
{
    $search_term = '%'.$value.'%';
    $stmt->execute();
    while($row = $stmt->fetchObject())
    {
        if(!isset($res[$row->id]))
            $res[$row->id] = 0;
        $res[$row->id] = $res[$row->id] + 1*strlen($value);
    }
}
print_r($res);

即使我在名称和文本的几个字段中都有字符串'app'和'ban',这也会给出一个空结果。当我在phpmyadmin中进行相同的搜索时,我得到了很多结果。

我尝试在关键字周围添加一些引号:'“%'。$ value'%”';没有成功。 我觉得我没有选择。请帮忙!

3 个答案:

答案 0 :(得分:2)

上面的两个答案对于bindValue是正确的 - 它在执行时只解析一次值。您可以使用bindParam,它在 - > execute()发生时解析。

根据PHP bindParam manual page

  

将PHP变量绑定到用于准备语句的SQL语句中的相应命名或问号占位符。与PDOStatement :: bindValue()不同,变量被绑定为引用,并且仅在调用PDOStatement :: execute()时进行计算。

答案 1 :(得分:1)

你将 $ search_term =''; 定义为空字符串,然后你使用了bindValue并使用了具有空字符串值的相同变量。

在循环内你尝试分配

$search_term = '%' . $value . '%'; 

但它已被绑定,因此你无法修改它。移动你的

$stmt->bindValue(':search_term1',$search_term, PDO::PARAM_STR);
$stmt->bindValue(':search_term2',$search_term, PDO::PARAM_STR);

之后

在foreach循环内部

$search_term = '%' . $value . '%'; 

答案 2 :(得分:0)

  1. 您将$search_term设置为空白字符串
  2. 您将两个搜索字词绑定为空字符串
  3. 然后输入一个重新设置$search_term值的循环,但不重新绑定。
  4. 然后,由于某种原因,您执行查询并检索结果,同时仍然在#3。
  5. 的循环中