gpt4 book ai didi

php - 正确参数化 mysqli 查询并打印多行

转载 作者:行者123 更新时间:2023-11-29 05:20:54 25 4
gpt4 key购买 nike

我知道这个问题几乎无处不在,但我似乎无法将其应用于我自己的问题。我一直在使用非参数化查询,这使我的项目极易受到 SQL 注入(inject)攻击

剧情:

我有一个表格,您可以在其中输入日期。PHP 将获取日期并在查询中使用它来检索多行信息。

如何参数化我的 mysqli 查询并打印出多行?这是我目前所拥有的:

HTML

<form action="#" class="form-horizontal" method="post">
<label for="fromDate" class="control-label">Date from:</label>
<input type="date" id="fromDate" class="datepicker" name="searchDate" value="<?php echo $searchDate; ?>">
<button type="submit" class="btn">Go</button>
<input type="hidden" name="formIdentifier" value="mainSearch" />
</form>

PHP

if($_POST['formIdentifier'] == "mainSearch"){
//get date from form
$searchDate = $_POST['searchDate'];
$todayDateFrom = $searchDate." 00:00:00";
$todayDateTo = $searchDate." 23:59:59";
$stmt = $conn->prepare("SELECT G.* FROM Groups AS G, Customers AS C
WHERE C.travel_Date >= '?'
AND C.travel_Date <= '?'
AND C.customer_ID = G.leader_ID");
$stmt->bind_param("si", todayDateFrom , todayDateTo );
$stmt->execute();
/* bind variables to prepared statement */
$stmt->bind_result($col1, $col2);
}

PHP 循环

while ($stmt->fetch()) {
//Display copious amounts of data.
}

我的代码基于 PHP 手册,但最终不知所措。我什至不确定我在准备查询方面是否走在正确的轨道上,更不用说尝试如何显示数据了。任何帮助将不胜感激!

注意 - 如果有人可以解释 $stmt->bind_param("si", todayDateFrom , todayDateTo ); 特别是“si”,那就太棒了。我只是不明白它的目的是什么。

--解决方案--

多亏了所有的答案,我的第一个参数化查询才得以运行。

按照建议,我删除了查询中“?”周围的“'”。

然后我将 bind_param“si”更改为“ss”,因为我绑定(bind)了 2 个字符串,而不是一个字符串和一个整数。

然后我绑定(bind)了结果(在这个例子中我在表中有 3 列)

$stmt->bind_result($group_ID, $leader_ID, $gDate);

因为我目前没有安装第 3 方驱动程序,所以我不得不像这样显示结果:

while ($stmt->fetch()) {
echo "group_ID: ".$group_ID."<br />";
echo "leader_ID: ".$leader_ID."<br />";
echo "group_Date: ".$group_Date."<br />";
}

最佳答案

您现有的代码工作得很好,除了您有一个小错误,来自手册 PHP MySQLi bind_param manual

i对应的变量类型为整型

d对应变量的类型为double

s对应的变量类型为string

所以从上面我们可以看出,如果你想告诉 MySQLi 你的参数实际上是整数,则使用“i”,如果你想告诉 MySQLi 你的参数实际上是一个整数,则使用“s”字符串。

所以请替换

$stmt->bind_param("si", todayDateFrom , todayDateTo );

$stmt->bind_param("ss", todayDateFrom , todayDateTo );

并删除

'

来自参数占位符(即“?”应替换为?)

并且您发送参数化语句的代码将正常工作

获取结果

来自手册PHP MySQLi fetch fetch 的作用是:

Fetch results from a prepared statement into the bound variables

您要找的是get_result .从手册中它:

Gets a result set from a prepared statement

因此您可以使用以下代码获取数据:

$result = $stmt->get_result();
while ($row = $result->fetch_array(MYSQLI_NUM))
{
foreach ($row as $r)
{
print "$r ";
}
print "\n";
}

这是 fetch_array 的文档

关于php - 正确参数化 mysqli 查询并打印多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25905043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com