我知道这是一个真正讨论过的话题,我不久前曾问过一个问题,这是一个无数次讨论过的话题。
但是,我仍然试图使用准备好的语句来保护网络应用程序。
真相是,从来没有真正得到它给出答案,查看重复的问题,查看其他问题和进行研究。
它可能不复杂......
所以,我有一个lcl_events.php
文件,以:
<?php include 'config/config.php'; ?>
<?php include'libraries/database.php'; ?>
database.php
文件,如下所示:
<?php
// Create connection
$mysqli= new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($mysqli->connect_errno) {
die("Connection failed: " . mysqli_connect_error());
}
?>
页面加载很好,到目前为止一直很好(这里没有问题)。
然后,文件本身也包含:
<?php
$sql = "select *
from companies where Company_Name LIKE (?) OR Company_Subcategory LIKE (?) OR Keywords LIKE (?) OR Description LIKE (?) AND Company_Category = (?) AND Featured = `Y` order by Date_Created DESC";
/* Prepared statement, stage 1: prepare */
$stmt = $mysqli->prepare($sql);
if(!$stmt) {
die("Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error);
}
/* Prepared statement, stage 2: bind and execute */
$target = $_GET['target'];
$company = $_GET['company'];
$category = $_GET['category'];
$target = '%'.$target.'%'; //this means the data coming from this GET method can have words before and/or after
$bind_result = $stmt->bind_param("sssss", $target, $target, $target, $target, $category);
$execute_result = $stmt->execute();
if(!$execute_result) {
echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {}
/* explicit close recommended */
$stmt->close();
$mysqli->close();
整个页面中重复重复6次。
(还试图在问号周围没有圆括号的情况下编写查询。
结果如下:
无错误出现在日志中或使用:
使用error_reporting(E_ALL);
ini_set(&#39; display_errors&#39;,&#39; 1&#39;);
注意:我使用的是PHPStorm,并且没有出现任何错误。
厌倦了这个问题,它需要花费很长时间才能得到它...真的很感谢你的帮助,我只是想让它发挥作用。
答案 0 :(得分:3)
将评论作为社区维基回答发布,因为它已在评论中解决。
按Qirel:
首先让我感到震惊的是查询失败,很可能是因为
Featured = `Y`
是反叛的。 Y真的是一个专栏吗?如果它是一个字符串,则需要使用单引号'
。此外,值得看看$ stmt-&gt;错误向您吐出的内容。旁注:(?)与?完全相同,你不需要括号。
由我自己:
顺便问一下,为什么这些括号(?)?当LIKE已经是核心MySQL方法时,你将LIKE视为直接函数。括号主要用于subqueries。 --- var_dump()您的查询,您将看到发生了什么(或不发生)。确保所有操作员都满足查询要求。如果一个失败了,那么整个都会。它可能 无声地失败 ,因为滴答在查询中是有效的,给定&#34;如果&#34; Y
是一个专栏,您尝试匹配等同于Featured
列的内容,这是一个完全有效的查询,但不是针对这种情况。