SQL预准备语句不返回任何结果(空结果)

时间:2019-02-22 05:37:31

标签: php sql pdo

如果我尝试使用search('samsung'),则以下准备好的语句不会返回任何结果。

public function search($searchFor) {
        try{
            //connect to db
            $pdo = $this->_db->connect();
            //set up SQL and bind parameters            
            $sql = "select * from item where itemName like '%:searchfor%' or description like '%:searchfor%'";
            $stmt = $pdo->prepare($sql);
            $stmt->bindParam(':searchfor', $searchFor, PDO::PARAM_STR);
            //execute SQL
            $rows = $this->_db->executeSQL($stmt);
            return $rows;
        }
        catch (PDOException $e)
        {
            throw $e;
        }
    }

$ rows返回一个空数组。但是,如果我尝试

select * from item where itemName like '%samsung%' or description like '%samsung%;

它返回匹配的项目并按预期工作。

我发现了

$sql = "select * from item where itemName like :searchfor or description like :searchfor";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(":searchfor", "%$searchFor%");

有效。我不得不使用bindValue代替。这是完全不同的问题,因为SQL是正确的,但是我使用bindParam而不是bindValue(这是正确的方法),因此不是重复的。

2 个答案:

答案 0 :(得分:1)

您是否尝试在整个语句中使用占位符?

$sql = "select * from item where itemName like :searchfor or description like :searchfor";
$stmt = $pdo->prepare($sql);
$search_string = "'%" . $searchFor . "'%";
$stmt->bindParam(':searchfor', $search_string, PDO::PARAM_STR);

可选地不带命名参数:

$sql = "select * from item where itemName like ? or description like ?";
$stmt = $pdo->prepare($sql);
$search_string = "'%" . $searchFor . "'%";
$stmt->bindParam('ss', $search_string, $search_string);

据我所记得的手册,就像需要将整个字符串都放在变量中,而不仅仅是要照顾的内容。

八月

答案 1 :(得分:0)

准备好的语句的占位符告诉php将传递到占位符的特定值视为字符串。代替这个:

$sql = "select * from item where itemName like '%:searchfor%' or 
description like '%:searchfor%'";

执行以下操作:

$sql = "select * from item where itemName like :searchfor or 
description like :searchfor";

然后将整个值绑定到占位符:

$stmt->bindParam(':searchfor', '%yourkeyword%', PDO::PARAM_STR);