如何在mysqli准备好的语句中使用SQL LIKE子句[重复]

Posted

技术标签:

【中文标题】如何在mysqli准备好的语句中使用SQL LIKE子句[重复]【英文标题】:How to use SQL LIKE clause with mysqli prepared statements [duplicate] 【发布时间】:2019-08-25 18:08:08 【问题描述】:

我正在尝试将 SQL LIKE 子句与 mysqli 准备好的语句一起使用。

我已经尝试过其他示例,例如 $sysName = "$_POST['ss']%";$sysName = $_POST['ss'] . '%';

if(isset($_POST['ss'])) 
   $sysName = $_POST['ss'] . '%';
      if(strlen($sysName) >0) 
         $qry = mysqli_stmt_prepare($link, "SELECT * FROM tblSchools WHERE systemName LIKE ?");
         mysqli_stmt_bind_param($qry,'s',$sysName);
         mysqli_stmt_execute($qry);
         $result = mysqli_stmt_get_result($qry);
      

如果 $_POST['ss'] 填充了单词 sys,并且在 tblSchools 中存在一个名为“system”的 systemName,则结果集应包含与“system”行相关的行信息。不管我放什么,尽管结果总是返回空值。我与数据库的连接成功。我已经成功地使用 mysqli_query 和直接字符串进行了测试,但是当我切换到 LIKE 子句上的准备好的语句时,它不起作用。几乎一整天以来,我一直在努力解决这个问题。

编辑:响应第一个答案 还是不行

    $stmt = mysqli_stmt_init($link);
    $sysName = "sys%";
    if(strlen($sysName) >0) 
        if(!mysqli_stmt_prepare($stmt, "SELECT * FROM tblSchools WHERE systemName LIKE ?")) 
            echo "1";
            exit;
         else 
            if(mysqli_stmt_bind_param($stmt,'s',$sysName)) echo "2";
            if(mysqli_stmt_execute($stmt)) echo "3";
            $result = mysqli_stmt_fetch($stmt);
            $row = mysqli_fetch_array($result);
            var_dump($row);
            echo "Hey";
        
    

打印 2 和 3 而不是 1

【问题讨论】:

当你说结果总是返回null,你的意思是$result是null吗? $result 为 NULL,当我使用 mysqli_stmt_num_rows($qry) 或 mysqli_num_rows($result) 时都返回空白 如果语句是 UPDATE、DELETE 或 INSERT,则可以使用 mysqli_stmt_affected_rows() 函数确定受影响行的总数。同样,如果查询产生结果集,则使用 mysqli_stmt_fetch() 函数。见:php.net/manual/en/mysqli-stmt.execute.php @AndreaManzi 我以前使用过 mysqli_stmt_get_result 并且可以正常工作。我只是尝试插入建议的mysqli_stmt_fetch,结果是一样的。 什么是 $qry? $result = mysqli_stmt_fetch($qry); 【参考方案1】:

试试这个:

$link = \mysqli_connect("127.0.0.1", "user", "password", "dbname");

if (!$link) 
    $error = \mysqli_connect_error();
    $errno = \mysqli_connect_errno();
    print "$errno: $error\n";
    exit();


$query = "SELECT * FROM tblSchools WHERE systemName LIKE ?";

$stmt = \mysqli_stmt_init($link);
if (!\mysqli_stmt_prepare($stmt, $query)) 
    print "Failed to prepare statement\n";
    exit;
 else 
    $sysName = 'sys%';
    \mysqli_stmt_bind_param($stmt, "s", $sysName);

    \mysqli_stmt_execute($stmt);
    $result = \mysqli_stmt_get_result($stmt);
    $row = mysqli_fetch_array($result);
    var_dump($row);

对我有用

【讨论】:

还是不行。请参阅原始问题中的编辑以获取响应中的代码块 它与op有何不同? @YourCommonSense 问题似乎是另一个问题,请参阅聊天

以上是关于如何在mysqli准备好的语句中使用SQL LIKE子句[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQLI 中使用准备好的语句?

在准备好的语句中使用 LIKE '%$var%' 的正确方法? [mysqli]

2个准备好的语句,2个存储过程,1个mysqli连接

使用 mysqli 和准备好的语句时命令不同步 [重复]

MySQLi准备好的语句不绑定整数

如何使用mysqli准备好的语句?