准备好的陈述 - 是的,我知道这是一个真正讨论过的话题
Prepared Statements - Yes I know it's a really discussed topic
我知道这是一个真正被讨论的话题,不久前我问过一个问题并且这个话题被讨论了无数次。
但是,我仍在尝试使用准备好的语句来保护 Web 应用程序。
事实是,从来没有真正让它与给定的答案一起工作,查看重复的问题,查看其他问题并进行研究。
不可能那么复杂...
所以,我有一个 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('display_errors', '1');
注意:我使用的是 PHPStorm,那里也没有出现任何错误。
厌倦了这个问题,它花了很长时间...真的很感谢你的帮助,我只是想让它工作。
将评论发布为社区维基答案,因为它已在评论中解决。
来自 Qirel:
首先让我印象深刻的是查询失败,很可能是因为
Featured = `Y`
在反引号中。 Y 真的是一列吗?如果是字符串,需要用单引号'
。此外,值得一看的是 $stmt->error 向您吐出的内容。旁注:(?) 与 ? 完全相同,您不需要括号。
我自己:
顺便说一句,为什么要用括号 (?) 表示这些?当 LIKE 已经是核心 MySQL 方法时,您将其视为直接函数。括号主要用于subqueries。 --- var_dump() 你的查询,你会看到发生了什么(或没有发生)。确保您所有的运营商都满足查询要求。如果一个人失败了,整个人都会失败。
可能 静静地失败了 因为报价在查询中是有效的,给定 "if" Y
是一列,您试图匹配等于 Featured
列的内容,这是一个完全有效的查询,但不适用于这种情况。
我知道这是一个真正被讨论的话题,不久前我问过一个问题并且这个话题被讨论了无数次。
但是,我仍在尝试使用准备好的语句来保护 Web 应用程序。
事实是,从来没有真正让它与给定的答案一起工作,查看重复的问题,查看其他问题并进行研究。
不可能那么复杂...
所以,我有一个 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('display_errors', '1');
注意:我使用的是 PHPStorm,那里也没有出现任何错误。
厌倦了这个问题,它花了很长时间...真的很感谢你的帮助,我只是想让它工作。
将评论发布为社区维基答案,因为它已在评论中解决。
来自 Qirel:
首先让我印象深刻的是查询失败,很可能是因为
Featured = `Y`
在反引号中。 Y 真的是一列吗?如果是字符串,需要用单引号'
。此外,值得一看的是 $stmt->error 向您吐出的内容。旁注:(?) 与 ? 完全相同,您不需要括号。
我自己:
顺便说一句,为什么要用括号 (?) 表示这些?当 LIKE 已经是核心 MySQL 方法时,您将其视为直接函数。括号主要用于subqueries。 --- var_dump() 你的查询,你会看到发生了什么(或没有发生)。确保您所有的运营商都满足查询要求。如果一个人失败了,整个人都会失败。
可能 静静地失败了 因为报价在查询中是有效的,给定 "if" Y
是一列,您试图匹配等于 Featured
列的内容,这是一个完全有效的查询,但不适用于这种情况。