Привязать несколько параметров к запросу mysqli

#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 месяцев назад, так что до сих пор все сводилось к тому, чтобы иметь возможность делать как можно больше. Теперь я думаю, что мне, возможно, нужно больше сосредоточиться на том, чтобы делать все как можно лучше!! Обнимаю и благодарю!