PHP mysqli prepare – генерировать динамически

Мой код для генерации SQL-оператора работает отлично – однако я запускаю hiccup при создании строки для $ stmt-> bind_param. Код выглядит следующим образом:

$stmt = $mysqli->stmt_init(); if ($stmt->prepare ($sql)) { $bind_types = '"'; $bind_values = '';

  if ($action == 'insert' || $action == 'update') { reset ($array); foreach ($array as $key => $value) { if (is_string ($value)) { $type = 's'; } else if (is_int ($value)) { $type = 'i'; } else if (is_float ($value)) { $type = 'd'; } else { die ('Cannot determine type for ' . $key . ' => ' . $value . ''); } $bind_types .= $type; $bind_values .= $value . ', '; //$stmt->bind_param ($type, $value); } } if ($action == 'update' || $action == 'delete') { if (is_string ($id_value)) { $type = 's'; } else if (is_int ($id_value)) { $type = 'i'; } else if (is_float ($id_value)) { $type = 'd'; } else { die ('Cannot determine type for ' . $id_column . ' => ' . $id_value . ''); } $bind_types .= $type; $bind_values .= $id_value . ', '; //$stmt->bind_param ($type, $id_value); } $bind_types .= '"'; $bind_values = substr ($bind_values, 0, -2); echo $bind_types . ', ' . $bind_values; $stmt->bind_param ($bind_types, $bind_values); $stmt->execute(); } 

Форматирование этого было испорчено. Прошу прощения, если его трудно читать.

Я получаю следующую ошибку:

"Предупреждение: mysqli_stmt :: bind_param () [mysqli-stmt.bind-param]: Число элементов в строке определения типа не соответствует числу переменных привязки в …"

Есть идеи?

Solutions Collecting From Web of "PHP mysqli prepare – генерировать динамически"

Я бы очень посоветовал использовать PDO, поскольку вы можете сделать это легко. Если вы хотите сделать это в mysqli, это сложнее, поскольку вы не можете легко связать их динамически. Чтобы связать их динамически, посмотрите на этот уродливый хак

 $bind_values= explode(',', $bind_values); call_user_func_array(array($stmt, 'bind_param'), makeValuesReferenced($bind_values)); $stmt->execute(); function makeValuesReferenced(&$arr){ $refs = array(); foreach($arr as $key => $value) $refs[$key] = &$arr[$key]; return $refs; } 

Ваш вызов bind_param неверен: он должен быть:

 bind_param($types, $value1, $value2, $value3 ...); 

где каждое из этих значений является фактической переменной.