2011-08-07 3 views
6

SQLモードを設定しようとしていますが、PDOを使用してSQLモードを設定する方法はわかりません。私はMySQLで伝統的なモードを設定しようとしており、無効な日付を許可していません。PDOの使用中にSQLモードを設定するにはどうすればよいですか?

誰でも手助けできますか?

+1

回答が間違っていることが判明しました。チェックマークを変更してください。 –

答えて

11

を参照してください。そうすれば、他のクライアントには影響しません。 SESSION sql_modeを設定し、クエリが完了した後に以前の値に戻すことができます。このようにして、特定の操作に対してsql_modeを設定できます。 MySQLのマニュアルから

「あなたは SETを使用して、実行時にSQLモードを変更することができます| sql_modeのシステムに 値を設定する[GLOBAL SESSION] sql_modeの= 'モード' ステートメントを。 GLOBAL変数を設定するにはSUPER特権が必要で、 はその時から接続するすべてのクライアントの動作に影響します。 SESSION変数の設定は現在のクライアントにのみ影響します。 クライアントはいつでも独自のセッションsql_mode値を変更できます。

これを処理するために私は個人的にいくつかのメソッドを自分のデータベースクラスに追加しました。 initSqlMode()は 'SELECT SESSION.sql_mode'というクエリを実行し、デフォルト値をクラス変数として保存します。 setSqlMode()を使用すると、SESSION sql_modeを(VALIDATED)カスタム値に設定できます。 resetSqlMode()は、SESSION sql_modeをデフォルト値に戻します。 sql_modeを常に操作するときは、SESSION変数を使用します。

次に、次のようなことができます。これは擬似コードのみであることに注意してください。私の例では、SQLインジェクションを防ぐか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

これは、ご使用の接続にのみ適用されます。このコマンドは、すぐにPDOが接続されているように実行されます。

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

を参照してくださいPHP: MySQL (PDO)
は、実行時にsql_modeのを設定するときは、オプションの「SESSION」変数を使用することができます5.1.6. Server SQL Modes

+0

ありがとうございました。 –

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

コードスニペットを説明する説明を追加できますか? :) – asteri

関連する問題