Php 使用通配符的MySQLi Prepared语句的奇怪结果(过程)

Php 使用通配符的MySQLi Prepared语句的奇怪结果(过程),php,mysqli,prepared-statement,bind,Php,Mysqli,Prepared Statement,Bind,这个有点奇怪。。。我正在使用mysqli编写的语句(包括通配符)和绑定结果,但尽管SQL语句在phpmyadmin中工作,但我无法将其正确输出到php文件中 谁能看出我做错了什么 $servername = "XXXX"; $username = "XXXX"; $password = "XXXX"; $dbname = "XXXX"; $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->

这个有点奇怪。。。我正在使用mysqli编写的语句(包括通配符)和绑定结果,但尽管SQL语句在phpmyadmin中工作,但我无法将其正确输出到php文件中

谁能看出我做错了什么

$servername = "XXXX"; $username = "XXXX"; $password = "XXXX"; $dbname = "XXXX";

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

if (!isset($_GET['searchfield'])) {
    $query_string = NULL;
} else {
    $query_string = $_GET['searchfield'];
}

$stmt = mysqli_prepare($conn, "
SELECT CONTACTS.CONTACTID, CONTACTS.COMPANY, CONTACTS.FORENAME, 
CONTACTS.SURNAME, CONTNOTES.NOTESID, CONTNOTES.NOTESCONTACTID, 
FILEATT.ATTNOTEID, FILEATT.LONGNOTE, FILEATT.CREATEDATE
FROM CONTACTS
INNER JOIN CONTNOTES
   ON CONTACTS.CONTACTID = CONTNOTES.NOTESCONTACTID
INNER JOIN FILEATT
   ON CONTNOTES.NOTESID = FILEATT.ATTNOTEID
WHERE FILEATT.LONGNOTE LIKE CONCAT('%',?,'%')
ORDER BY FILEATT.CREATEDATE ASC
");

mysqli_stmt_bind_param($stmt, "s", $query_string);// bind parameters
mysqli_stmt_execute($stmt);// execute query
mysqli_stmt_bind_result($stmt, $CONTACTID, $COMPANY, $FORENAME, $SURNAME, $NOTESID, $NOTESCONTACTID, $ATTNOTEID, $LONGNOTE, $CREATEDATE);
$rowcount = mysqli_stmt_num_rows($stmt);

if($rowcount > 0){

    while (mysqli_stmt_fetch($stmt)) {

        echo stuff i.e $COMPANY;
    }

}

mysqli_stmt_close($stmt);
mysqli_close ($conn);
首先,我没有得到$rowcount的值

其次,如果我注释掉if($rowcount>0){那么它似乎在抛出错误之前循环了2行(应该有数百行):

警告:mysqli_stmt_fetch()要求参数1为mysqli_stmt,filename.php中给出的为null

如果我回显一个长音符字段,它就会变成无法识别的胡言乱语


有什么想法吗?可能是我错过了一些简单的东西。

终于解决了这个问题

这是longtext字段的一个异常。我的FILEATT.LONGNOTE字段是longtext,输出只是垃圾,将页面的其余部分丢弃。执行后,您必须使用mysqli_stmt_store_result($stmt);这似乎解决了问题


请参见

我看不到任何mysqli错误处理。请将此添加到脚本顶部:
mysqli_报告(mysqli_报告错误| mysqli_报告严格)
@IncredibleHat-谢谢-输出没有区别。这似乎很奇怪。因为$stmt将为null的原因是如果mysqli失败了,错误报告应该抛出一个原因。如果我正确理解您的查询,您不能像这样解析准备好的参数,您需要像这样做:
where
field`like?`和
('%'.$foo'%',)
然而,公平地说,我相信像CONCAT一样的怪异
方法仍然有效……这是我从未做过或见过的事情,因为它看起来非常怪异;)