Php 使用通配符的MySQLi Prepared语句的奇怪结果(过程)
这个有点奇怪。。。我正在使用mysqli编写的语句(包括通配符)和绑定结果,但尽管SQL语句在phpmyadmin中工作,但我无法将其正确输出到php文件中 谁能看出我做错了什么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->
$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一样的怪异方法仍然有效……这是我从未做过或见过的事情,因为它看起来非常怪异;)