SQL预处理语句返回无结果(空结果)[重复]

问题描述 投票:1回答:2

如果我尝试搜索('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(这是正确的方法),因此这不是重复。

php sql pdo
2个回答
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);

据我记得手册一样,需要在变量中包含整个字符串,而不仅仅是要处理的内容。

八月


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);
© www.soinside.com 2019 - 2024. All rights reserved.