使用bind_result&fetch

时间:2019-07-03 20:38:59

标签: php mysqli prepared-statement

我正在迁移到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 / mysqli代码的表示,它们存在于许多需要修改的php文件中。现有的mysql SELECT语句变化最大。但是,基于我收到的反馈,我相信由于没有传递任何变量,因此没有理由使用带有绑定的预备语句。但是,我确实有一些形式可以传递变量(GET和POST),并且我将使用准备好的语句(bind_param,bind_result和fetch)修改那些php文件。我希望这是有道理的:-)我只是认为显示一个我最初打算修改的代码示例会更有用,因为我可能不需要根据我在这里收到的反馈以及我所得到的内容进行大量修改自从我的原始帖子以来已经读过(关于我的关注: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); 
?>

1 个答案:

答案 0 :(得分:1)

您实际上并不需要bind_result()fetch()

使用PHP7,几乎可以肯定,您将拥有get_result(),它将为您提供一个熟悉的 resource 型变量,您可以从中获取熟悉的数组。

$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>";    
}

因此您可以保留很多旧代码。

一些注意事项:

  • 就像@Dharman所说的那样,如果在查询中不使用占位符,则您实际上不需要准备/绑定/执行例程。
  • 就像@Dharman所说的那样,最好尝试使用PDO,它更容易使用。

也就是说,您可以使用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]);