2011-08-07 15 views
6

Estoy tratando de establecer modos SQL, no puedo encontrar la manera de hacerlo usando PDO. Estoy tratando de establecer el modo tradicional en MySQL y no permitir fechas no válidas.¿Cómo puedo configurar el modo SQL mientras uso PDO?

¿Alguien puede ayudar?

+1

La respuesta aceptada no es correcta, ¿puedes cambiar la marca? –

Respuesta

11

Puede utilizar la variable opcional 'sesión' cuando se ajusta el sql_mode en tiempo de ejecución. De esa forma no afectará a otros clientes. Puede establecer SESIÓN sql_mode y luego establecerlo de nuevo al valor anterior después de que su consulta se haya completado. De esta manera, puede establecer el sql_mode para una operación específica.

Desde el manual de MySQL:

"Se puede cambiar el modo SQL en tiempo de ejecución mediante el uso de un conjunto [SESSION | GLOBAL] Declaración sql_mode = 'modos' para establecer el sistema de sql_mode valor. Establecer la variable GLOBAL requiere el privilegio SUPER y afecta la operación de todos los clientes que se conectan desde ese momento. Establecer la variable SESIÓN afecta solo al cliente actual. Cualquier cliente puede cambiar su propio valor sql_mode de sesión en cualquier momento. "

Personalmente agregué algunos métodos a mi clase de base de datos para manejar esto. initSqlMode() ejecutará la consulta 'SELECT SESSION.sql_mode' y almacenará el valor predeterminado como una variable de clase. setSqlMode() le permitirá configurar SESSION sql_mode a un valor personalizado (VALIDADO). resetSqlMode() restablece SESSION sql_mode al valor predeterminado. Utilizo la variable SESSION cuando manipulo el sql_mode en todo momento.

Luego puede hacer algo como lo siguiente. Tenga en cuenta que esto es solo psuedocode; no hay nada en mi ejemplo para evitar la inyección de SQL o parametrizar la consulta SQL.

$db = new database(); 
$badqueryresult = $db->executeStrict('BAD SQL QUERY'); 
Class database { 
    ... 
    function executeStrict($query){ 
     $this->initSqlMode(); 
     $this->setSqlMode('STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'); 
     $result = $this->Execute($query); 
     $this->resetSqlMode(); 
     return $result; 
    } 
} 
10

Esto se aplica solo a su conexión. El comando se ejecutará tan pronto como se conecta DOP:

$pdo = new PDO(
    $dsn, 
    $username, 
    $password, 
    array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET sql_mode="TRADITIONAL"') 
); 

Ver PHP: MySQL (PDO)
Ver 5.1.6. Server SQL Modes

+0

Muchas gracias. –

2
function get_pdo($c =false){ 

    if (!$c){$c=get_config();} 
    $pdo=new PDO($c['dsn'] , $c['db_user'], $c['db_password']); 
    $better_sql_defaults=array (
     'SET SESSION sql_warnings=1', 
     'SET NAMES utf8', 
     'SET SESSION sql_mode = "ANSI,TRADITIONAL" ', 
    ); 

    // throw an exception on errors 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    foreach ($better_sql_defaults as $sql){ 
     $pdo->query($sql); 
    } 
    return $pdo; 
} 
+4

¿Podría agregar alguna descripción que explique su fragmento de código? :) – asteri

Cuestiones relacionadas