Избегать передачи неопределенных переменных в mysqli_stmt_bind_param? - PullRequest
0 голосов
/ 03 января 2019

К сожалению, mysqli_stmt_bind_param не выдает ошибку, когда в функцию передана неопределенная переменная (даже если включены все ошибки). Таким образом, вы могли бы написать что-то вроде этого, не получая столько предупреждений (просто обрабатывает неопределенную переменную как NULL):

<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
mysqli_report(MYSQLI_REPORT_ALL);

$db = mysqli_connect('host', 'user', 'pass', 'database');
$Stmt = mysqli_stmt_init($db);
mysqli_stmt_prepare($Stmt, 'SELECT id FROM table WHERE value = ?');
mysqli_stmt_bind_param($Stmt, 's', $UndefinedVariable); // <---------
mysqli_stmt_execute($Stmt);
mysqli_stmt_bind_result($Stmt, $ID);
mysqli_stmt_fetch($Stmt);
mysqli_stmt_close($Stmt);

?>

Теперь, я уверен, я уже сообщал об этом разработчикам PHP около года назад, но мне в основном сказали, что они не могут / не смогут это исправить. Однако сейчас я не могу найти отчет ...

Так что я надеюсь найти решение, чтобы заставить PHP кричать на меня, когда я (вероятно) только что сделал опечатку в источнике, что иногда случается! Есть ли для этого нативное решение?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Использование обертки, кажется, работает, но я не уверен, что это лучшее решение?

function db_stmt_bind_param($Stmt, $Types, ...$Params)
{
    return mysqli_stmt_bind_param($Stmt, $Types, ...$Params);
}

В качестве альтернативы:

mysqli_stmt_bind_param($Stmt, $Types, ...[$Param1, $Param2, $Param3])

Оба требуют использования оператора splat, однако,это относительно недавняя реализация.

0 голосов
/ 03 января 2019

Единственное нативное решение, которое не использует код, - это просмотреть журнал ошибок на предмет обнаружения неопределенных переменных.

Что касается нативного решения, включающего код, выполните некоторую базовую проверку входных данных, например, используя isset($variable),Например, вы можете сделать следующее:

if(!isset($UndefinedVariable)) {
    throw new Exception('Expected variabled "$UndefinedVariable" to be defined.');
}

В общем, вы все равно должны действительно проверять ввод.Это занимает больше времени и удлиняет ваш код, но также обеспечивает безопасность вашего кода и делает то, что вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...