MySQLi带通配符的预处理语句的奇怪结果(过程)

时间:2018-07-11 12:56:25

标签: 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->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中指定为空

如果我回显一个longnote字段,结果就是无法识别的胡言乱语。

有什么想法吗?这可能是我想念的简单事情。

1 个答案:

答案 0 :(得分:0)

最后解决了这个问题。

这是长文本字段的异常。我的FILEATT.LONGNOTE字段是longtext,输出只是垃圾,它把页面的其余部分扔掉了。您必须使用mysqli_stmt_store_result($ stmt);。执行后。看来已经解决了问题。

请参见Prepared mysqli select statement on longtext field is coming back empty