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

Изпълнете PDO с масив, съдържащ нулеви стойности

Моля, помислете за използването на bindValue вместо да предавате масива за изпълнение. Както пише тук :

Би трябвало да е възможно да направите това доста прозрачно за останалата част от вашето приложение, тъй като вече имате стойностите, които искате да АКТУАЛИРАТЕ като масив. Опитайте напр. нещо подобно:

<?php
function executeWithDataTypes(PDOStatement $sth, array $values) {
    $count = 1;
    foreach($values as $value) {
        $sth->bindValue($count, $values['value'], $values['type']);
        $count++;
    }

    return $sth->execute();
}

$sth = $handle->prepare("UPDATE table SET name = ?, id_extra1 = ?, id_extra2 = ? WHERE id_something = ?");

$values = array();
$values[] = array('value' => 'testing', 'type' => PDO::PARAM_STR);
$values[] = array('value' => 2, 'type' => PDO::PARAM_INT);
$values[] = array('value' => null, 'type' => PDO::PARAM_NULL);
$values[] = array('value' => 1958, 'type' => PDO::PARAM_INT);

$result = executeWithDataTypes($sth, $values);
?>

Тъй като отбелязахте, че използването на bindParam ви причиняваше главоболия в миналото, моля, имайте предвид фината разлика между bindValue и bindParam . Лично аз никога не използвам bindParam поради странични ефекти, които затрудняват разбирането на скриптове, въпреки че, разбира се, има случаи, когато тези ефекти ще бъдат полезни.

РЕДАКТИРАНЕ:Разбира се, бихте могли да опростите функцията още повече и да се отървете от необходимостта от посочване на типа като допълнителен ключ в предадения масив, като направите нещо като:

$type = PDO::PARAM_STR;
switch(true) {
    case is_null($value): $type = PDO::PARAM_NULL; break;
    case is_numeric($value): $type = PDO::PARAM_INT; break;
    // ...
    default: break;
}

и определяне на типа въз основа на типа на стойността, предадена в масива; това обаче е по-податливо на грешки, тъй като напр. float също са числови и това би довело до грешно решение в горния оператор switch, но реших да го спомена за пълнота.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Примери за DAYOFMONTH() – MySQL

  2. MySQL показва състоянието - активни или общи връзки?

  3. Използвайте времева марка (или дата и час) като част от първичен ключ (или част от клъстериран индекс)

  4. изберете произволна стойност въз основа на вероятността

  5. Вземете ред с най-висока или най-ниска стойност от GROUP BY