Mysql
 sql >> база данни >  >> RDS >> Mysql

Имам масив от цели числа, как да използвам всяко от тях в mysql заявка (в php)?

Както при почти всички въпроси "Как да направя 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;
}

Добавете още заместители на параметри за други полета, ако имате нужда от тях.

Кой да изберете?

  • Първият вариант работи с променлив брой записи итеративно, удряйки базата данни няколко пъти. Това е най-полезно за операции UPDATE и INSERT.

  • Вторият вариант също работи с променлив брой записи, но удря базата данни само веднъж. Това е много по-ефективно от итеративния подход, очевидно можете да направите едно и също нещо с всички засегнати записи. Това е най-полезно за операции SELECT и DELETE или когато искате да АКТУАЛИЗИРАТЕ няколко записа с едни и същи данни.

Защо подготвени изявления?

  • Подготвените оператори са много по-безопасни, защото правят атаките с инжектиране на SQL невъзможни. Това е основната причина да се използват подготвени изявления, дори ако написването им е повече работа. Разумният навик, който да придобиете, е:Винаги използвайте подготвени изявления, дори ако смятате, че това „не е необходимо“. Пренебрегването ще дойде и ще ви ухапе (или вашите клиенти).
  • Повторното използване на един и същ подготвен израз няколко пъти с различни стойности на параметри е по-ефективно от изпращането на множество пълни SQL низове към базата данни, тъй като базата данни трябва да компилира оператора само веднъж и може да го използва повторно.
  • Само стойностите на параметрите се изпращат към базата данни на execute() , така че трябва да преминават по-малко данни, когато се използват многократно.

При по-дълги цикли разликата във времето на изпълнение между използването на подготвен оператор и изпращането на обикновен SQL ще стане забележима.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL - Как да сумираме пъти?

  2. Функция MySQL DEGREES() – Преобразуване от радиани в градуси

  3. Най-бързият начин за намиране на разстояние между две широчини/дълги точки

  4. Хибридна облачна репликация за MySQL за висока наличност

  5. Как да промените стойността на автоматично увеличение на MySQL / MariaDB база данни