Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用bind_result&fetch推出准备好的语句_Php_Mysqli_Prepared Statement - Fatal编程技术网

Php 使用bind_result&fetch推出准备好的语句

Php 使用bind_result&fetch推出准备好的语句,php,mysqli,prepared-statement,Php,Mysqli,Prepared Statement,我正在迁移到php7和msqli。我有很多旧的php文件,需要使用bind_result&fetch准备语句。因此,在修改所有这些文件之前,我想确保使用bind_result&fetch正确地编写了准备好的语句,这样它们就不会受到sql注入的影响。我的示例中的代码适用于我正确地绑定和获取,但我只想确保我对它们进行了安全编码。我还在学习为其他实现编写准备好的语句 我还尝试了get_result而不是bind_result,但出于我的目的,我相信bind_result就足够了 下面是一个php文件的

我正在迁移到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进行db连接的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注入。但欢迎提出任何意见或建议。多谢各位

<?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); 
?>
更新:我决定在下面展示一个当前代码的示例,我将使用带有bind_结果的准备语句修改它,上面的示例是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); 
?>
实际上,您不需要绑定和获取结果

使用PHP7,几乎可以肯定您将获得一个熟悉的资源类型变量,您可以从中获得熟悉的数组

$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>";    
}
您只需两行即可完成:

$sql = "SELECT image, caption FROM tblimages WHERE catID = ? ORDER by imageID";
$res = mysqli_select($con, $sql, [$id]);

如果你可以尝试转到PDO。它的语法稍微简单一些,提供了更多的功能。至于SQL注入,您的示例没有任何要绑定的数据,您可以只使用查询。如果要将变量日期传递给DB,则准备好的语句是有意义的。谢谢您的回复。我可能最终会尝试PDO。但是我现在不是一个很好的php程序员。关于sql注入,我想我明白你说的不绑定数据是什么意思了。这是因为没有绑定参数,即没有输入或更改数据吗?如果是这样的话,在本例中是否有任何理由不使用bind_result&fetch?我想我读过所有sql查询都使用准备好的语句,包括那些只选择和输出结果的语句,就像在本例中强烈建议的那样?或者在这种情况下使用mysqli_查询更有效?对不起,我还在学习。谢谢。好的,我会再次查看结果。出于好奇,保留我的bind\u result fetch示例与使用第一个get\u result示例相比,是否有额外的执行开销?或者它主要只是一个函数,没有传递变量,因此甚至不需要使用准备好的语句来绑定数据,因为没有任何东西需要绑定?另外,使用get_result是正确的方法吗?顺便说一句,我要修改的大多数php文件都像我的示例一样,不传递任何变量,使用mysqli\u query和mysqli\u fetch\u数组,但没有准备好的语句。谢谢。在现实生活中试试这个绑定吧。你会看到,我决定编辑/更新我的原始帖子,以包含一个我最初认为需要用准备好的语句修改的代码示例。我认为它可能会更有用,因为我在更新中添加的示例代表了我认为需要修改的内容。非常感谢。