Вы уверены, что выполняете свои модульные тесты в Debug? Debug.WriteLine не будет отбрасываться в версиях выпуска.
Две возможности для проверки:
Как почти со всеми, "Как я делаю 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;
}
Добавляют больше заполнителей параметра для других полей, поскольку Вам нужны они.
, Который выбрать?
первый вариант работает с переменным количеством записей многократно, поражая базу данных многократно. Это является самым полезным для ОБНОВЛЕНИЯ, и ВСТАВЬТЕ операции.
вторые различные работы с переменным количеством записей также, но это поражает базу данных только однажды. Это намного более эффективно, чем итерационный подход, очевидно, можно только сделать то же самое ко всем затронутым записям. Это является самым полезным для ВЫБОРА, и УДАЛИТЕ операции, или когда Вы хотите ОБНОВИТЬ несколько записей с теми же данными.
, Почему подготовленные операторы?
execute()
, таким образом, меньше данных должно пробежаться через провод при повторном использовании. В более длинных циклах различие времени выполнения между использованием подготовленного оператора и отправкой плоскости SQL станет примечательным.
Аминь к комментарию 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]));
}
Мог бы быть тем, что Вы после
$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);
}
$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
}
Вы могли сделать что-то как следующее, однако необходимо быть ОЧЕНЬ осторожными, что массив только содержит целые числа иначе, Вы могли закончить с Внедрением 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);