У меня есть массив целых чисел, как я использую каждого в запросе mysql (в php)?

Вы уверены, что выполняете свои модульные тесты в Debug? Debug.WriteLine не будет отбрасываться в версиях выпуска.

Две возможности для проверки:

  • Trace.WriteLine (), который встроен в сборку выпусков inot, а также debug
  • Определить DEBUG в настройках сборки для модульного теста
19
задан 1 December 2008 в 08:22
поделиться

5 ответов

Как почти со всеми, "Как я делаю SQL из PHP" вопросы - действительно необходимо ли использовать подготовленные операторы. Дело не в этом трудно:

$ids  = array(2, 4, 6, 8);

// prepare an SQL statement with a single parameter placeholder
$sql  = "UPDATE MyTable SET LastUpdated = GETDATE() WHERE id = ?";
$stmt = $mysqli->prepare($sql);

// bind a different value to the placeholder with each execution
for ($i = 0; $i < count($ids); $i++)
{
    $stmt->bind_param("i", $ids[$i]);
    $stmt->execute();
    echo "Updated record ID: $id\n";
}

// done
$stmt->close();

, С другой стороны, можно сделать это как это:

$ids    = array(2, 4, 6, 8);

// prepare an SQL statement with multiple parameter placeholders
$params = implode(",", array_fill(0, count($ids), "?"));
$sql    = "UPDATE MyTable SET LastUpdated = GETDATE() WHERE id IN ($params)";
$stmt   = $mysqli->prepare($sql);

// dynamic call of mysqli_stmt::bind_param                    hard-coded eqivalent
$types = str_repeat("i", count($ids));                        // "iiii"
$args = array_merge(array($types), $ids);                     // ["iiii", 2, 4, 6, 8]
call_user_func_array(array($stmt, 'bind_param'), ref($args)); // $stmt->bind_param("iiii", 2, 4, 6, 8)

// execute the query for all input values in one step
$stmt->execute();

// done
$stmt->close();
echo "Updated record IDs: " . implode("," $ids) ."\n";

// ----------------------------------------------------------------------------------
// helper function to turn an array of values into an array of value references
// necessary because mysqli_stmt::bind_param needs value refereces for no good reason
function ref($arr) {
    $refs = array();
    foreach ($arr as $key => $val) $refs[$key] = &$arr[$key];
    return $refs;
}

Добавляют больше заполнителей параметра для других полей, поскольку Вам нужны они.

, Который выбрать?

  • первый вариант работает с переменным количеством записей многократно, поражая базу данных многократно. Это является самым полезным для ОБНОВЛЕНИЯ, и ВСТАВЬТЕ операции.

  • вторые различные работы с переменным количеством записей также, но это поражает базу данных только однажды. Это намного более эффективно, чем итерационный подход, очевидно, можно только сделать то же самое ко всем затронутым записям. Это является самым полезным для ВЫБОРА, и УДАЛИТЕ операции, или когда Вы хотите ОБНОВИТЬ несколько записей с теми же данными.

, Почему подготовленные операторы?

  • Подготовленные операторы намного более безопасны, потому что они делают атаки с использованием кода на SQL невозможными. Это - основная причина для использования подготовленных операторов, даже если это - больше работы, чтобы записать им. Разумная привычка войти: Всегда используйте подготовленные операторы, даже если Вы думаете, что это "не действительно необходимо". Пренебрежение прибудет и укусит Вас (или Ваши клиенты).
  • Многократное использование того же подготовленного оператора многократно с различными значениями параметров более эффективно, чем отправка нескольких полных строк SQL к базе данных, потому что база данных только должна скомпилировать оператор однажды и может снова использовать его также.
  • Только значения параметров отправляются в базу данных по execute(), таким образом, меньше данных должно пробежаться через провод при повторном использовании.

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

36
ответ дан 30 November 2019 в 03:08
поделиться

Аминь к комментарию Tomalak к операторам.

Однако, если Вы не хотите использовать mysqli, можно всегда использовать intval () для предотвращения инжекции:

$ids  = array(2, 4, 6, 8);
for ($i = 0; $i < count($ids); $i++)
{
    mysql_query("UPDATE MyTable SET LastUpdated = GETDATE() WHERE id = " . intval($ids[$i]));
}
1
ответ дан 30 November 2019 в 03:08
поделиться

Используя "В" Пункте

Мог бы быть тем, что Вы после

$ids = array(2,4,6,8);
$ids = implode($ids);
$sql="SELECT * FROM my_table WHERE id IN($ids);";
mysql_query($sql);

иначе, что случилось с

$ids = array(2,4,6,8);
foreach($ids as $id) {
    $sql="SELECT * FROM my_table WHERE ID = $id;";
    mysql_query($sql);
}
5
ответ дан 30 November 2019 в 03:08
поделиться
$values_filtered = array_filter('is_int', $values);
if (count($values_filtered) == count($values)) {
    $sql = 'update table set attrib = 'something' where someid in (' . implode(',', $values_filtered) . ');';
    //execute
} else {
    //do something
}
1
ответ дан 30 November 2019 в 03:08
поделиться

Вы могли сделать что-то как следующее, однако необходимо быть ОЧЕНЬ осторожными, что массив только содержит целые числа иначе, Вы могли закончить с Внедрением SQL.

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

foreach ($array as $key = $var) {
   if ((int) $var <= 0) {
       unset($array[$key]);
   }
}


$query = "SELECT * 
from content 
WHERE contentid IN ('".implode("','", $array)."')";

$result = mysql_query($query);
0
ответ дан 30 November 2019 в 03:08
поделиться
Другие вопросы по тегам:

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