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?
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?
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;
}
}
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
Dziękuję bardzo. –
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;
}
Czy możesz dodać opis wyjaśniający twój fragment kodu? :) – asteri
Przyjęta odpowiedź okazała się niepoprawna, czy możesz zmienić znak zaznaczenia? –