#php #prepared-statement
#php #mysqli #bindparam
Вопрос:
Прямо сейчас мне нужно использовать следующую структуру, чтобы справиться с привязкой нескольких параметров к запросу mysqli:
if ($words_total == 1)
{
$statement -> bind_param("s", $words[0]);
}
else if ($words_total == 2)
{
$statement -> bind_param("ss", $words[0], $words[1]);
}
else if ($words_total == 3)
{
$statement -> bind_param("sss", $words[0], $words[1], $words[2]);
}
//and so on....
Я вычисляю количество вопросительных знаков, используя приведенный ниже код, и вставляю его в свой запрос:
$marks = "";
for($i = 1; $i<=$words_total; $i ) {
if ($i == $words_total)
{
$marks .= "?";
}
else
{
$marks .= "?,";
}
}
Мой вопрос в том, что наверняка должен быть способ динамически обрабатывать столько входных данных в запросе, сколько мне нужно. Жесткое кодирование bind_param()
кажется действительно плохим способом справиться с этим.
Я использую php версии 5.4.10
Ответ №1:
К сожалению, по умолчанию bind_param() не принимает массив вместо отдельных переменных. Однако, начиная с PHP 5.6, есть великолепное улучшение, которое сделает свое дело.
Чтобы привязать произвольное количество переменных к запросу mysqli, вам понадобится оператор распаковки аргументов. Это сделает операцию максимально простой и плавной.
Например, чтобы использовать массив PHP с IN()
оператором mysql, вам понадобится следующий код
// our array
$array = ['a','b','c'];
// create an SQL query with placeholders and prepare it
$in = str_repeat('?,', count($array) - 1) . '?'; // returns ?,?,?...
$sql = "SELECT name FROM table WHERE city IN ($in)";
$stmt = $mysqli->prepare($sql);
// create the types string dynamically and bind an array
$types = str_repeat('s', count($array)); // returns sss...
$stmt->bind_param($types, ...$array);
// execute and fetch the rows
$stmt->execute();
$result = $stmt->get_result(); // get the mysqli result
$data = $result->fetch_all(MYSQLI_ASSOC); // fetch the data
Комментарии:
1. Большое спасибо за это — я был буквально в отчаянии из-за моего уродливого решения этой проблемы. Я согласен, что сообщения об ошибках — это моя слабость, о которой мне нужно потратить время, чтобы узнать больше. Я выучил php всего около 2 месяцев назад, так что до сих пор все сводилось к тому, чтобы иметь возможность делать как можно больше. Теперь я думаю, что мне, возможно, нужно больше сосредоточиться на том, чтобы делать все как можно лучше!! Обнимаю и благодарю!