Mysql
 sql >> Database >  >> RDS >> Mysql

Supporto PDO per query multiple (PDO_MYSQL, PDO_MYSQLND)

Come so, PDO_MYSQLND sostituito PDO_MYSQL in PHP 5.3. La parte confusa è che il nome è ancora PDO_MYSQL . Quindi ora ND è il driver predefinito per MySQL+PDO.

Nel complesso, per eseguire più query contemporaneamente è necessario:

  • PHP 5.3+
  • mysqlnd
  • Dichiarazioni preparate emulate. Assicurati di PDO::ATTR_EMULATE_PREPARES è impostato su 1 (predefinito). In alternativa puoi evitare di usare istruzioni preparate e usare $pdo->exec direttamente.

Utilizzo di exec

$db = new PDO("mysql:host=localhost;dbname=test", 'root', '');

// works regardless of statements emulation
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);

$sql = "
DELETE FROM car; 
INSERT INTO car(name, type) VALUES ('car1', 'coupe'); 
INSERT INTO car(name, type) VALUES ('car2', 'coupe');
";

$db->exec($sql);

Utilizzo delle dichiarazioni

$db = new PDO("mysql:host=localhost;dbname=test", 'root', '');

// works not with the following set to 0. You can comment this line as 1 is default
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);

$sql = "
DELETE FROM car; 
INSERT INTO car(name, type) VALUES ('car1', 'coupe'); 
INSERT INTO car(name, type) VALUES ('car2', 'coupe');
";

$stmt = $db->prepare($sql);
$stmt->execute();

Una nota:

Quando si utilizzano istruzioni preparate emulate, assicurarsi di aver impostato la codifica corretta (che rifletta la codifica dei dati effettiva) in DSN (disponibile da 5.3.6). Altrimenti potrebbe esserci una leggera possibilità di SQL injection se viene utilizzata una codifica dispari .