Динамические Подготовленные Операторы Плохо? (с php + mysqli)

Действительно нужна дополнительная информация, но это то, что вы ищете?

// List of twitter tags
let list = ["@someone", "@anotherperson", "@thisperson"];

const displayAccounts = (arr) => {
  let target = document.querySelector('ul');
  arr.forEach(twit => {
    let html = `<a href="https://twitter.com/${twit}" target="_blank">${twit}</a>`;
    let li = document.createElement('li');
    li.innerHTML = html;
    target.appendChild(li);
  });
};

document.addEventListener('DOMContentLoaded', () => {
  displayAccounts(list);
});
<div>
  <ul>
  </ul>
</div>

7
задан Tomalak 14 October 2008 в 15:24
поделиться

2 ответа

Я думаю, что опасно использовать eval() здесь.

Попробуйте это:

  • выполните итерации массива параметров для создания строки SQL с вопросительными знаками "SELECT * FROM t1 WHERE p1 = ? AND p2 = ?"
  • звонить prepare() на этом
  • использовать call_user_func_array() выполнять вызов к bind_param(), передача в динамическом массиве параметров.

Код:

call_user_func_array(array($stmt, 'bind_param'), array($types)+$param);
14
ответ дан 6 December 2019 в 19:44
поделиться

Вам действительно не нужны подготовленные операторы и связанные аргументы, потому что можно всегда использовать mysql_real_escape_string (). И Вы правы; динамично сгенерированный SQL намного более гибок и ценен.

Вот простой пример с помощью регулярного интерфейса mysql_*:

// Array of WHERE conditions
$conds = array("customer_id" => 1, "qty" => 2);

$wherec = array("1");
foreach ($conds as $col=>$val) $wherec[] = sprintf("`%s` = '%s'", $col, mysql_real_escape_string($val));

$result_set = mysql_query("SELECT * FROM t1 WHERE " . implode(" AND ", $wherec);

Конечно, это - упрощенный пример, и сделать это полезным, что необходимо создать и совершенствовать его много, но это показывает идеи, и это действительно очень очень полезно. Например, вот абсолютно родовая функция для вставки новой строки в произвольную таблицу со столбцами, заполненными значениями от ассоциативного массива и полностью безопасного Внедрения SQL:

function insert($table, $record) {
    $cols = array();
    $vals = array();
    foreach (array_keys($record) as $col) $cols[] = sprintf("`%s`", $col);
    foreach (array_values($record) as $val) $vals[] = sprintf("'%s'", mysql_real_escape_string($val));

    mysql_query(sprintf("INSERT INTO `%s`(%s) VALUES(%s)", $table, implode(", ", $cols), implode(", ", $vals)));
}

// Use as follows:
insert("customer", array("customer_id" => 15, "qty" => 86));
-1
ответ дан 6 December 2019 в 19:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: