Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Suporte PDO para várias consultas (PDO_MYSQL, PDO_MYSQLND)


Como eu sei, PDO_MYSQLND substituiu PDO_MYSQL em PHP 5.3. A parte confusa é que o nome ainda é PDO_MYSQL . Então agora o ND é o driver padrão para MySQL+PDO.

No geral, para executar várias consultas de uma só vez, você precisa:
  • PHP 5.3+
  • mysqlnd
  • Declarações preparadas emuladas. Certifique-se de que PDO::ATTR_EMULATE_PREPARES está definido como 1 (predefinição). Alternativamente, você pode evitar o uso de instruções preparadas e usar $pdo->exec diretamente.

Usando executivo
$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);

Usando declarações
$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();

Uma observação:


Ao usar instruções preparadas emuladas, verifique se você definiu a codificação adequada (que reflete a codificação de dados real) em DSN (disponível desde 5.3.6). Caso contrário, pode haver uma pequena possibilidade de injeção de SQL se alguma codificação estranha for usada .