【问题标题】:SQL prepared statement returns no result (empty result) [duplicate]SQL准备好的语句没有返回结果(空结果)[重复]
【发布时间】:2019-07-16 04:05:32
【问题描述】:

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

【问题讨论】:

  • 我不得不改用 bindValue

标签: php sql pdo


【解决方案1】:

准备好的语句的占位符告诉 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);

【讨论】:

    【解决方案2】:

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

    $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);
    

    据我记得手册,好像需要在变量中包含整个字符串,而不仅仅是要照顾的内容。

    八月

    【讨论】:

    • 您的第二次bindParam 呼叫是错误的。这是 PDO,而不是 MySQLi。此外,除非PDO::ATTR_EMULATE_PREPARES 处于打开状态,否则您不能重复使用命名参数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多