Ich dachte mir, da ich sowieso gerade den Testblock hier hab, kann ich ihn auch gleich hier posten.
Hab mir Gedanken gemacht, wie ich P.S. für mich am sinnvollsten nutze. Und falls jemand Ideen hat - her damit =)
PHP
<?php
// settings:
define('MYSQL_HOST', 'localhost');
define('MYSQL_BENUTZER', 'xxx'); // <-
define('MYSQL_KENNWORT', '');
define('MYSQL_DATENBANK', 'xxx'); // <-
define('TABLE','xxx'); // <-
define('ERROR_MESSAGE_SQL','Ooops ...');
$main_array['timing']['SQL']['time'] = 0;
$main_array['timing']['SQL']['count'] = 0;
// connect to the db
try{
$main_array['sql']['dbh'] = new PDO('mysql:host='.MYSQL_HOST.';dbname='.MYSQL_DATENBANK, MYSQL_BENUTZER, MYSQL_KENNWORT, array(PDO::ATTR_PERSISTENT => true));
define('SQL_CONNECTED_AND_SELECTED',true);
prepareSQLStatements($main_array);
}catch(PDOException $e){
$main_array['error']['admin'][] = 'Error: '.$e->getMessage();
$main_array['error']['user'][] = ERROR_MESSAGE_SQL;
define('SQL_CONNECTED_AND_SELECTED',false);
}
// prepare statements
function prepareSQLStatements($main_array)
{
global $main_array;
$main_array['sql']['stmts']['sel_id_where_nick'] = $main_array['sql']['dbh']->prepare("SELECT id FROM ".TABLE." WHERE nickname = :nickname");
//$main_array['sql']['stmts']['sel_id_where_nick'] = $main_array['sql']['dbh']->prepare("SELECT id FROM ".TABLE." WHERE nickname = :nickname and test = :test");
$main_array['sql']['stmts']['sel_nick_where_id'] = $main_array['sql']['dbh']->prepare("SELECT nickname FROM ".TABLE." WHERE id = :id");
}
// execute statements plus catch errors, timing, amount of queries
function executeStatement($main_array, $stmt, $array)
{
global $main_array;
if($array === false){
$time_startSQL = microtime(true);
if(!$stmt->execute()){
$arr = $stmt->errorInfo();
$main_array['error']['admin'][] = 'SQL Error: (SQLSTATE error code: '.$arr[0].') '.$arr[2];
$main_array['error']['user'][] = ERROR_MESSAGE_SQL;
$main_array['timing']['SQL']['time'] += microtime(true) - $time_startSQL;
$main_array['timing']['SQL']['count'] += 1;
return false;
}else{
$main_array['timing']['SQL']['time'] += microtime(true) - $time_startSQL;
$main_array['timing']['SQL']['count'] += 1;
return($stmt);
}
}else{
$time_startSQL = microtime(true);
/*debug*/echo "<pre>";print_r($stmt);print_r($array);echo"</pre><hr />";
if(!$stmt->execute($array)){
$arr = $stmt->errorInfo();
$main_array['error']['admin'][] = 'SQL Error: (SQLSTATE error code: '.$arr[0].') '.$arr[2];
$main_array['error']['user'][] = ERROR_MESSAGE_SQL;
$main_array['timing']['SQL']['time'] += microtime(true) - $time_startSQL;
$main_array['timing']['SQL']['count'] += 1;
return false;
}else{
$main_array['timing']['SQL']['time'] += microtime(true) - $time_startSQL;
$main_array['timing']['SQL']['count'] += 1;
return($stmt);
}
}
}
// do some ...
if(SQL_CONNECTED_AND_SELECTED === true){
if(!$main_array['sql']['stmts']['sel_nick_where_id'] = executeStatement($main_array, $main_array['sql']['stmts']['sel_nick_where_id'], array('id' => 1))){
// do something if failed
}else{
if($row = $main_array['sql']['stmts']['sel_nick_where_id']->fetch(PDO::FETCH_ASSOC)){
$nickname = $row['nickname'];
}
}
if(!$main_array['sql']['stmts']['sel_id_where_nick'] = executeStatement($main_array, $main_array['sql']['stmts']['sel_id_where_nick'], array('nickname' => 'cottton'))){
// do something if failed
}else{
if($row = $main_array['sql']['stmts']['sel_id_where_nick']->fetch(PDO::FETCH_ASSOC)){
$id = $row['id'];
}
}
}
// output
echo 'Result nickname: '.@$nickname.'<br />';
echo 'Result id: '.@$id.'<br />';
echo '<hr />';
echo 'SQL time: '.$main_array['timing']['SQL']['time'].'<br />';
echo 'SQL queries: '.$main_array['timing']['SQL']['count'].'<br />';
echo '<hr />';
echo 'errors:'.'<br />';
$x = 0;
if(isset($main_array['error']['admin'])){
foreach($main_array['error']['admin'] as $err){
$x++;
echo '#'.$x.'(adm) '.$err.'<br />';
}
}
$x = 0;
if(isset($main_array['error']['user'])){
echo '<br />';
foreach($main_array['error']['user'] as $err){
$x++;
echo '#'.$x.'(user) '.$err.'<br />';
}
}
if($x == 0){
echo 'No errors';
}
?>
Alles anzeigen
Ich glaube ich fange alle Fehler ab.
Nur wenn man mehr vordefiniert als man "reinschickt" gibts komischerweise keine e-message, sondern nur den e-code.
(bsp "...WHERE nickname = :nickname and test = :test" wobei "test" später nicht reingeschickt wird. Ergibt dann nur e-code: 'HY093')