2011-08-07 13 views
6

SQL modlarını ayarlamaya çalışıyorum, PDO kullanarak nasıl yapılacağını anlayamıyorum. Geleneksel modu MySQL'de ayarlamaya çalışıyorum ve geçersiz tarihlere izin vermemeye çalışıyorum.PDO kullanırken SQL modunu nasıl ayarlayabilirim?

Herkes yardımcı olabilir mi?

+1

Kabul edilen yanıt yanlış olduğu ortaya çıktı, lütfen onay işaretini değiştirir misiniz? –

cevap

11

Sen isteğe bağlı 'session' değişkeni kullanabilirsiniz bak. Bu şekilde diğer müşterileri etkilemez. SESSION sql_mode öğesini ayarlayabilir ve ardından sorgulama tamamlandıktan sonra önceki değere geri yükleyebilirsiniz. Bu şekilde, belirli bir işlem için sql_mode öğesini ayarlayabilirsiniz. MySQL kılavuzunda itibaren

:

"Sen bir SET kullanarak çalışma zamanında SQL modunu değiştirebilirsiniz | sql_mode sistemi değerini ayarlamak için [GLOBAL OTURUM] sql_mode = 'modun deyimi. GLOBAL değişkenini ayarlamak, SUPER ayrıcalığını gerektirir ve , o zamandan bağlanan tüm istemcilerin çalışmasını etkiler. SESSION değişkeni ayarı yalnızca geçerli istemciyi etkiler. Herhangi bir istemcisi, herhangi bir zamanda kendi oturum sql_mode değerini değiştirebilir. "

Bunu işlemek için veritabanı sınıfıma kişisel olarak bazı yöntemler ekledim. initSqlMode() 'SELECT SESSION.sql_mode' sorgusunu yürütecek ve varsayılan değeri bir sınıf değişkeni olarak saklayacaktır. setSqlMode(), SESSION sql_mode değerini (VALIDATED) özel değerine ayarlamanıza izin verir. resetSqlMode(), SESSION sql_mode değerini varsayılan değere döndürür. Sql_mode'yi her zaman manipüle ederken SESSION değişkenini kullanırım.

Ardından, aşağıdaki gibi bir şey yapabilirsiniz. Bu sadece psuedocode olduğunu unutmayın; Örneğimde sql enjeksiyonunu engellemek veya sql sorgusunu parametrelemek için hiçbir şey yoktur.

$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

Bu yalnızca sizin bağlantınız için geçerlidir. Komut kısa sürede PDO bağlayan şeklinde geçer:

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

PHP: MySQL (PDO)
zamanında sql_mode ayarlarken 5.1.6. Server SQL Modes

+0

Çok teşekkür ederim. –

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

Kod snippet'inizi açıklayan bir açıklama ekleyebilir misiniz? :) – asteri

İlgili konular