Развертывание подготовленных операторов с использованием bind_result & fetch - PullRequest
0 голосов
/ 03 июля 2019

Я в процессе перехода на 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);

?>

А вот файл php, который устанавливает соединение с БД через "require", то есть 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, приведите пример выше). Ниже приведено представление большей части кода php / mysqli, который существует в настоящее время и который содержится во многих файлах php, которые необходимо изменить. Больше всего меняются существующие операторы SELECT mysql. Однако, основываясь на полученных мной отзывах, я считаю, что поскольку не передаются переменные, нет причин использовать подготовленные операторы с привязкой. Тем не менее, у меня есть некоторые формы, которые передают переменные (GET & POST), и я изменю эти php-файлы, используя подготовленные операторы (bind_param, bind_result & fetch). Я надеюсь, что это имело смысл :-) Я просто подумал, что было бы более полезно показать пример кода, который я изначально планировал изменить, поскольку мне, возможно, не потребуется вносить изменения в него, основываясь на отзывах, которые я получил здесь, плюс то, что я прочитал, так как мой оригинальный пост (на моей озабоченности 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); 
?>

1 Ответ

1 голос
/ 04 июля 2019

На самом деле вам не нужны 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, его гораздо проще использовать.

Тем не менее, вы можете значительно сократить накладные расходы с помощью простой вспомогательной функции mysqli . Вместо написания этого монстра кода (давайте представим, что идентификатор в запросе динамический)

$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]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...