准备好的陈述 - 是的,我知道这是一个真正讨论过的话题

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 列的内容,这是一个完全有效的查询,但不适用于这种情况。