Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sprawdzenie błędów mysql ze wszystkich zapytań.
Forum PHP.pl > Forum > PHP
peku33
Witajcie. Czy jest jakaś funkcja, opcja, dzięki której pod koniec działania skryptu zobaczę, czy którekolwiek z zapytań zwróciło błąd?

Ewentualnie czy jest jakaś inna opcja żeby zobaczyć czy kod php nie wywołuje żadnych błędów?
Fifi209
mysql_error
mysql_errno

ciężko poszukać?
marcio
Cytat
Ewentualnie czy jest jakaś inna opcja żeby zobaczyć czy kod php nie wywołuje żadnych błędów?

error_reporting()
sniver
ja robie to tak:

  1. <?php
  2.  
  3. try {
  4.  
  5. $query = 'select 2+2';
  6. if( !$db->query($query) ) {
  7. throw new Exception('blad zapytania sql');
  8. }
  9.  
  10. }
  11. catch( Exception $e ) {
  12. echo '<pre>';
  13. }
  14.  
  15. ?>
-=Peter=-
@sniver - wynajdujesz koło na nowo i to jeszcze w gorszym wydaniu...
  1. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
sniver
@-=Peter=-

nie zupełnie. To tylko fragment, dzięki podobnej składni jestem w stanie monitorować i logować nie tylko wydajność, błędy ale i wiele innych cennych informacji..

korzystam z podobnego kodu od pewnego czasu i spisuje sie nieźle..poza tym nie wykorzystuję pdo...
peku33
No więc właśnie ja potrzebuję czegoś co pokaże wszystkie błędy z wielu mysql_query()
mysql_error() pokazuje tylko ostatni i zwraca null jeżeli ostatnie było OK nawet jeżeli poprzednie były błędne.

W końcu zrobiłem sobie alias funkcji mysql_query jako q i dodaje go globalnej wynik funkcji zaraz po zapytaniu.
sniver
dawno nie kożystałem z mysql_query..

ale postaram się to zmontować o ile masz php5 na serwerq :-)

plik: db.class.php

  1. <?php
  2.  
  3. define('HOST', 'localhost');
  4. define('USER', 'root');
  5. define('PASSWORD', 'miejsce na hasło');
  6. define('SCHEMA', 'baza danych');
  7. define('PORT', 3306);
  8. define('DIR_LOG', './log/%s.log');
  9.  
  10.  
  11. function begin() {
  12. $time = microtime();
  13. $time = explode(' ',$time);
  14. $time = $time[1] + $time[0];
  15. return $time;
  16. }
  17.  
  18. function finish( $time1 ) {
  19. $time = microtime();
  20. $time = explode(' ',$time);
  21. $time = $time[1] + $time[0];
  22. $time2 = $time;
  23. $total = ($time2 - $time1);
  24.  
  25. $total = round($total, 5);
  26.  
  27. return $total;
  28. }
  29.  
  30. function log_exception( $e ) {
  31. $log = 'Dnia: ' . date('Y-m-d') . ', o godzinie: ' . date('H:i:s') . "\n";
  32. $log.= 'Wywolanie z adresu: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . "\n";
  33. $log.= 'Plik: ' . $e->getFile() . "\n";
  34. $log.= 'Linia: ' . ($e->getLine()-1) . "\n";
  35. $log.= 'Komunikat: ' . ( !$e->getMessage() ? 'Brak wymaganego pliku' : $e->getMessage() ) . "\n";
  36. $log.= "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n";
  37.  
  38. $file = sprintf( DIR_LOG, date('y-m-d') ) ;
  39. if ( !file_exists( str_replace(date('y-m-d').'.log', null, $file) ) ) {
  40. if ( !mkdir( str_replace(date('y-m-d').'.log', null, $file) ) ) {
  41. return false;
  42. }
  43. chmod( str_replace(date('y-m-d').'.log', null, $file), 0777);
  44. }
  45.  
  46. $file = fopen($file, 'a+');
  47. fwrite($file, $log);
  48. fclose($file);
  49. return true;
  50. }
  51.  
  52.  
  53. function err( $e ) {
  54.  
  55. if ( function_exists('log_exception') ) {
  56. log_exception( $e );
  57. }
  58.  
  59. $err = '<style type="text/css">'
  60. .'<!--'
  61. .'dl, dt, dd {'
  62. .'display: block; margin: 0; padding: 0;'
  63. .'}'
  64. .'dt {'
  65. .'float: left;'
  66. .'font-weight: bold;'
  67. .'}'
  68. .'//-->'
  69. .'</style>'
  70. .'<h1>Plik: '.$e->getFile().'</h1>'
  71. .'<h2>Bład lini: '.($e->getLine()-1).'</h2>'
  72. .'<dl>'
  73. .'<dt>Komunikat: </dt>'
  74. .'<dd>'
  75. .( !$e->getMessage() ? 'Brak wymaganego pliku' : $e->getMessage() )
  76. .'</dd>'
  77. .'</dl>';
  78.  
  79. echo $err;
  80. exit(null);
  81. }
  82.  
  83. /**
  84. * Klasa obslugi bazy danych
  85. */
  86. class db
  87. extends mysqli
  88. {
  89.  
  90. /**
  91. * Przechowuje zapytania
  92. *
  93. * @var string
  94. */
  95. public $query = false;
  96.  
  97. /**
  98. * Utrzymuje polaczenie
  99. *
  100. * @var object
  101. */
  102. static private $singleton = false;
  103.  
  104.  
  105. /**
  106. * Uruchamia debugera
  107. *
  108. * @var bool
  109. */
  110. private $debug = false;
  111.  
  112. /**
  113. * Zlicza ilosc zapytan
  114. *
  115. * @var int
  116. */
  117. private $debugCount = 0;
  118.  
  119. /**
  120. * Zlicza wszystkie czasy zapytan
  121. *
  122. * @var float
  123. */
  124. private $debugTime = 0;
  125.  
  126. /**
  127. * Kontener na wyliczenia
  128. *
  129. * @var string
  130. */
  131. private $debugHTML = false;
  132.  
  133.  
  134. private function __construct($host, $user, $pass, $schema, $port) {
  135. try {
  136.  
  137. parent::__construct(
  138. $host,
  139. $user,
  140. $pass,
  141. $schema
  142. );
  143.  
  144.  
  145. if ( mysqli_connect_errno() ) {
  146. throw new Exception( mysqli_connect_error() );
  147. }
  148.  
  149. /* Ustawienie kodowania */
  150. parent::query('SET NAMES utf8');
  151. parent::query('SET CHARACTER SET utf8');
  152. }
  153. catch(Exception $e) {
  154. err($e);
  155. }
  156. }
  157.  
  158. static function __connect() {
  159. try {
  160. if ( !self::$singleton ) {
  161. self::$singleton = new db(
  162. HOST,
  163. USER,
  164. PASSWORD,
  165. SCHEMA,
  166. PORT
  167. );
  168. }
  169.  
  170. if ( mysqli_connect_errno() ) {
  171. throw new Exception( mysqli_connect_error() );
  172. }
  173.  
  174. return self::$singleton;
  175. }
  176. catch (Exception $e) {
  177. err( $e );
  178. }
  179. }
  180.  
  181.  
  182. public function query( $query ) {
  183. try {
  184.  
  185. if( self::$singleton->debug ) {
  186. $queryTime = begin();
  187. }
  188.  
  189. $result =& parent::query($query);
  190.  
  191. if( self::$singleton->debug ) {
  192. $time = finish($queryTime);
  193. self::$singleton->debugHTML.= '
  194. <div style="overflow-x: auto; width: 720px; display: block; margin: 15px auto; background: #eee; border: 3px solid #aaa; color: #000;">
  195. Czas wykonywania: ' . $time . '
  196. <pre style="color: #666;">'. $query .'</pre>
  197. </div>
  198. ';
  199. self::$singleton->debugCount++;
  200. self::$singleton->debugTime+= $time;
  201. }
  202.  
  203. return $result;
  204.  
  205. }
  206. catch (Exception $e) {
  207. err( $e );
  208. }
  209. }
  210.  
  211. private function debugMSG() {
  212. try {
  213.  
  214. $html = "<div id='debugSQL' style='position: absolute; top: 20px; left: 20px; width: 800px; background: #fff; color: #000; border: 5px solid #666; auto; padding: 15px; z-index: 100;'>";
  215. $html.= "<div style='text-align: right;'><a href='java script:;' onclick='document.getElementById(\"debugSQL\").style.display=\"none\";'>zamknij</a></div>";
  216. $html.= "<h1>Debug SQL</h1>";
  217. $html.= "<div>Czas wykonywania: <strong>" . self::$singleton->debugTime . "</strong></div>";
  218. $html.= "<div>W sumie wykonano: <strong>" . self::$singleton->debugCount . "</strong></div><hr />";
  219. $html.= str_replace("\r\n", '', self::$singleton->debugHTML);
  220. $html.= "</div>";
  221.  
  222. echo $html;
  223. }
  224. catch (Exception $e) {
  225. err( $e );
  226. }
  227. }
  228.  
  229. public function __destruct() {
  230. try {
  231. if( self::$singleton->debug ) {
  232. return self::debugMSG();
  233. }
  234. }
  235. catch( Exception $e ) {
  236. err( $e );
  237. }
  238. }
  239.  
  240. }
  241.  
  242. ?>
  243.  


Po skonfigurowaniu (na początku są te regółki define)
Odpala sie to tak:

plik costam.php
  1. <?php
  2.  
  3. try
  4. {
  5. include_once 'db.class.php';
  6.  
  7. $query = 'SELECT * FROM `tabela`';
  8. if( !$result = db::__connect()->query( $query ) ) {
  9. throw new Exception('Blad zapytania SQL');
  10. }
  11.  
  12. $arr = array();
  13. while( $row = $result->fetch_assoc() ) {
  14. $arr[] = $row;
  15. }
  16.  
  17. var_dump($arr);
  18.  
  19. }
  20. catch( Exception $e ) {
  21. err( $e );
  22. }
  23. ?>


Ten kto coś wie to wie że może sobie dowolnie kod zmodyfikować i wystarczy zmienną: private $debug = false; na private $debug = true; i wtedy się wyświetlą wszyściutkie zapytana które sie poprawnie wykonały i ich orientacyjne czasy. Każde źle wykonane zapytanie będzie teraz logowane do katalogu log który trzeba utworzyć i nadać prawa do zapisu..

Pozdro

PS. Klasa została przygotowana na wzór czegoś podobnego na php.net w tutkach-komentarzach ale nie pamiętam dokładnie..

PS2. Klasa wymaga obsługi mysqli
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.