我正在迁移到php7 & msqli。我有很多旧的php文件,需要使用bind_result和fetch来准备语句。因此,在我修改所有这些文件之前,我希望确保我使用bind_result & fetch正确地编码了准备好的语句,这样它们就不会受到sql注入的影响。我的示例中的代码为我工作(正确绑定和获取),但我只想确保我对它们进行了安全的编码。我还在学习为其他实现编写已准备好的语句。
我也尝试了get_result而不是bind_result,但就我的目的(数据库交互)而言,我相信bind_result就足够了。
以下是一个php文件的示例,我将使用它作为所有其他php文件的模板,这些文件将需要使用bind_result &fetch使用准备好的语句进行修改:
<?php
//mysqli object oriented - bind_result prepared statement
//connect to database
require 'con_db.php';
//prepare, bind_result and fetch
$stmt = $con->prepare("SELECT image, caption FROM tblimages
WHERE tblimages.catID = 6 ORDER by imageID");
$stmt->execute();
$stmt->bind_result($image, $caption);
while ($stmt->fetch()) {
echo "{$image} <br> {$caption} <br> <br>";
}
$stmt->close();
//close connection
mysqli_close($con);
?>下面是通过"require“建立数据库连接的php文件,即con_db.php:
<?php
//mysqli object oriented connect to db
//MySQL errors get transferred into PHP exceptions in error log
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
//establish connection, any connection errors go to php.errors
$con = new mysqli('localhost','uid','pw',
'db');
?>我希望我以一种合理安全的方式编写了准备好的语句,以防止sql注入。但是任何意见和建议都是欢迎的。谢谢。
更新:我决定(在下面)展示一个当前代码的例子,我打算用准备好的语句来修改(用上面的bind_result,fetch例子)。因此,下面是当前存在于许多需要修改的php文件中的大多数php/mysqli代码的表示。变化最大的是现有的mysql SELECT语句。但是,根据我收到的反馈,我认为既然没有传递变量,就没有理由使用带有绑定的预准备语句。但是,我有一些表单可以传递变量(GET和POST),我将使用准备好的语句(bind_param、bind_result和fetch)修改这些php文件。我希望这是有意义的:-)我只是想展示一个我最初计划修改的代码的例子会更有用,因为我可能不需要根据我在这里收到的反馈,再加上我在最初的帖子(关于我关心的re: sql注入)之后读到的东西,来修改它的大部分内容。但是如果我错了,请随时纠正我。谢谢。
<?php
//mysqli object oriented - mysqli_query & mysqli_fetch_array
//connect to database
require 'con_db.php';
//query and fetch
$result = mysqli_query($con,"SELECT image, caption FROM
tblimages WHERE tblimages.catid = 1");
while($row = mysqli_fetch_array($result))
{
echo $row['image'];
echo "<br />";
echo $row['caption'];
echo "<br />";
}
mysqli_close($con);
?>发布于 2019-07-04 13:25:27
实际上,您并不需要bind_result() fetch().
使用PHP7,您几乎肯定会拥有get_result(),它将为您提供一个熟悉的资源类型变量,您可以从中获得熟悉的数组。
$stmt = $con->prepare("SELECT image, caption FROM tblimages
WHERE catID = 6 ORDER by imageID");
$stmt->execute();
$res = $stmt->get_result();
while ($row = $res->fetch_assoc()) {
echo "{$row['image']} <br> {$row['caption']} <br> <br>";
}因此,您可以完整地保留许多旧代码。
以下是一些注意事项:
也就是说,您可以使用simple mysqli helper function极大地减少开销。而不是编写这种庞然大物的代码(假设查询中的id是动态的)
$sql = "SELECT image, caption FROM tblimages WHERE catID = ? ORDER by imageID";
$stmt = $con->prepare($sql);
$stmt->bind_param("s", $catId);
$stmt->execute();
$res = $stmt->get_result();你只需要两行代码就可以了:
$sql = "SELECT image, caption FROM tblimages WHERE catID = ? ORDER by imageID";
$res = mysqli_select($con, $sql, [$id]);https://stackoverflow.com/questions/56877625
复制相似问题