警告:mysqli_stmt::bind_param():尝试保护查询时,类型定义字符串中的元素数量与绑定变量的数量不匹配

Warning: mysqli_stmt::bind_param(): Number of elements in type definition string doesn't match number of bind variables when trying to secure query

我想使用 bind_param 函数保护我的 php 代码免受 sql 注入,但我遇到了这个错误。我检查了 ? 和 bind_param 的数量,但它们都相等,所以我不知道我做错了什么。

我认为这是错误的来源:

$conn = mysqli_connect($servername, $username, $password, $database);
$searchText = $_POST['search'];
echo "You searched for: " . htmlspecialchars($searchText, ENT_QUOTES, 'UTF-8');
$query = $conn->prepare("SELECT * FROM recources WHERE recource_title LIKE '%?%' OR recource_topic LIKE '%?%' OR recource_author LIKE '%?%' OR recource_description LIKE '%?%';");
$query->bind_param('s', $searchText, $searchText, $searchText, $searchText);
$query->execute();

编辑:我尝试使用 $query->bind_param('ssss' 而不是 1 s,但我仍然遇到此错误。

您需要取消对占位符的引用并连接绑定中的通配符。您的错误是因为您的查询中没有占位符。

更正占位符后,您需要更正绑定调用。第一个参数是每个被绑定的变量是这样的:

bind_param('s'

真的应该

bind_param('ssss'

(因为你有 4 个变量)一个完整的例子:

$query = $conn->prepare("SELECT * FROM recources WHERE recource_title LIKE ? OR recource_topic LIKE ? OR recource_author LIKE ? OR recource_description LIKE ?;");
$wild_var = '%' . $searchText . '%';
$query->bind_param('ssss', $wild_var, $wild_var, $wild_var, $wild_var);
$query->execute();