0

我已经用谷歌搜索并阅读了很多关于如何使用 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'%"'; 没有成功。我觉得我别无选择。请帮忙!

4

3 回答 3

2

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

根据PHP bindParam 手册页

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

于 2013-02-20T23:44:17.383 回答
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 . '%'; 
于 2013-02-20T23:32:59.830 回答
0
  1. 您设置$search_term为空白字符串
  2. 您将两个搜索词绑定为空白字符串
  3. 然后您进入一个重新设置 的值$search_term但不重新绑定的循环。
  4. 然后,由于某种原因,您仍在 #3 的循环中执行查询并检索结果。
于 2013-02-20T23:33:16.960 回答