2011-08-07 14 views
6

Próbuję ustawić tryby SQL, nie mogę dowiedzieć się, jak to zrobić za pomocą PDO. Próbuję ustawić tryb tradycyjny w MySQL i nie zezwalam na nieprawidłowe daty.Jak ustawić tryb SQL podczas korzystania z PDO?

Czy ktoś może pomóc?

+1

Przyjęta odpowiedź okazała się niepoprawna, czy możesz zmienić znak zaznaczenia? –

Odpowiedz

11

można wykorzystywać podczas ustawiania sql_mode zmienną w czasie wykonywania opcjonalnej „sesja”. W ten sposób nie wpłynie to na innych klientów. Możesz ustawić SESJA SQI_SQL, a następnie ustawić ją z powrotem do poprzedniej wartości po zakończeniu zapytania. W ten sposób można ustawić sql_mode dla określonej operacji.

z podręcznika MySQL:

„Można zmienić tryb SQL w czasie wykonywania przy użyciu zestawu [GLOBAL | SESSION] Oświadczenie sql_mode = 'trybach' aby ustawić system sql_mode wartość. Ustawienie zmiennej GLOBAL wymaga uprawnienia SUPER, a wpływa na działanie wszystkich klientów, którzy łączą się od tego czasu. Ustawienie zmiennej SESSION wpływa tylko na bieżącego klienta.Każdy klient może zmienić swoją własną wartość sesji sql_mode w dowolnym momencie. "

Ja osobiście dodałem kilka metod do mojej klasy bazy danych, aby sobie z tym poradzić. initSqlMode() wykona zapytanie "SELECT SESSION.sql_mode" i zapisze wartość domyślną jako zmienną klasy. Metoda setSqlMode() pozwala ustawić SESJĘ SESJĘ na wartość niestandardową (WALIDOWANE). resetSqlMode() ustawia ponownie Sesję sql_mode na wartość domyślną. Używam zmiennej SESSION podczas manipulowania modułem sql_ przez cały czas.

Następnie możesz zrobić coś takiego. Zauważ, że jest to tylko psuedokod; nie ma nic w moim przykładzie, aby zapobiec sql injection lub sparametryzować kwerendę 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

Dotyczy tylko Twojego połączenia. Komenda będzie działać tak szybko, jak łączy PDO:

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

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

+0

Dziękuję bardzo. –

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

Czy możesz dodać opis wyjaśniający twój fragment kodu? :) – asteri

Powiązane problemy