Сведения о вопросе

Getthesound

02:34, 15th August, 2020

Теги

php   mysql   orm   mysqli    

PHP + MYSQLI: привязка переменных параметров / результатов к подготовленным операторам

Просмотров: 525   Ответов: 4

В проекте, который я собираюсь завершить, я написал и реализовал решение объектно-реляционного сопоставления для PHP. Прежде чем сомневающиеся и мечтатели воскликнут: "как же так?", расслабьтесь - Я не нашел способа сделать работу поздней статической привязки - я просто работаю над этим наилучшим образом,который я могу сделать.

В любом случае, в настоящее время я не использую подготовленные операторы для запросов, потому что я не мог придумать способ передать переменное количество аргументов в методы bind_params() или bind_result() .

Почему мне нужно поддерживать переменное количество аргументов, спросите вы? Потому что суперкласс моих моделей (подумайте о моем решении как о взломанном PHP ActiveRecord wannabe) - это то, где определяется запрос, и поэтому метод find(), например, не знает, сколько параметров ему нужно будет связать.

Теперь я уже думал о создании списка аргументов и передаче строки в eval(), но мне не очень нравится это решение-я бы предпочел просто реализовать свои собственные проверки безопасности и передать операторы.

Есть ли у кого-нибудь предложения (или истории успеха) о том, как это сделать? Если вы можете помочь мне решить эту первую проблему, возможно, мы сможем решить привязку результирующего набора (что-то, что я подозреваю, будет сложнее или, по крайней мере, более ресурсоемким, если он включает в себя первоначальный запрос для определения структуры таблицы).



  Сведения об ответе

lats

19:55, 13th August, 2020

В PHP можно передать переменное число аргументов функции или методу с помощью call_user_func_array . Примером такого метода может быть:

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);

Функция будет вызвана с каждым членом массива, переданным в качестве собственного аргумента.


  Сведения об ответе

SKY

11:11, 6th August, 2020

Вы должны убедиться, что $array_of_params-это массив ссылок на переменные, а не сами значения. Должно быть:

$array_of_params[0] = &$param_string; //link to variable that stores types

И затем...

$param_string .= "i";
$user_id_var = $_GET['user_id'];//
$array_of_params[] = &$user_id_var; //link to variable that stores value

В противном случае (если это массив значений) вы получите:

PHP предупреждение: ожидается, что параметр от 2 до mysqli_stmt::bind_param() будет являться ссылкой


Еще один пример:

$bind_names[] = implode($types); //putting types of parameters in a string
for ($i = 0; $i < count($params); $i++)
{
   $bind_name = 'bind'.$i; //generate a name for variable bind1, bind2, bind3...
   $$bind_name = $params[$i]; //create a variable with this name and put value in it
   $bind_names[] = & $$bind_name; //put a link to this variable in array
}

и BOOOOOM:

call_user_func_array( array ($stmt, 'bind_param'), $bind_names); 


  Сведения об ответе

PROGA

14:00, 27th August, 2020

Мне не разрешают редактировать, но я верю в этот код

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);

Ссылка перед $stmt не нужна. Поскольку $stmt -это объект, а bindparams -метод в этом объекте, ссылка не нужна. Так и должно быть:

call_user_func_array(array($stmt, 'bindparams'), $array_of_params);

Дополнительные сведения см. В руководстве PHP по функциям обратного вызова ."


  Сведения об ответе

park

08:06, 29th August, 2020

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);

Это не сработало для меня в моем окружении, но этот ответ поставил меня на правильный путь. Что на самом деле сработало, так это:

$sitesql = '';
$array_of_params = array();
foreach($_POST['multiselect'] as $value){
    if($sitesql!=''){
        $sitesql .= "OR siteID=? ";
        $array_of_params[0] .= 'i';
        $array_of_params[] = $value;
    }else{
        $sitesql = " siteID=? ";
        $array_of_params[0] .= 'i';
        $array_of_params[] = $value;
    }
}

$stmt = $linki->prepare("SELECT IFNULL(SUM(hours),0) FROM table WHERE ".$sitesql." AND week!='0000-00-00'");
call_user_func_array(array(&$stmt, 'bind_param'), $array_of_params);
$stmt->execute();


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться