1--TEST-- 2PDO::ATTR_ERRMODE 3--SKIPIF-- 4<?php 5require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc'); 6require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc'); 7MySQLPDOTest::skip(); 8$db = MySQLPDOTest::factory(); 9?> 10--INI-- 11error_reporting=E_ALL 12--FILE-- 13<?php 14 require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc'); 15 $db = MySQLPDOTest::factory(); 16 17 $valid = array(PDO::ERRMODE_SILENT, PDO::ERRMODE_WARNING, PDO::ERRMODE_EXCEPTION); 18 do { 19 $invalid = mt_rand(-1000, 1000); 20 } while (in_array($invalid, $valid)); 21 22 23 $tmp = array(); 24 if (false != @$db->setAttribute(PDO::ATTR_ERRMODE, $tmp)) 25 printf("[001] Maybe PDO could indicate that this is not a proper way of setting the ERRMODE...\n"); 26 27 $tmp = new stdClass(); 28 $ret = @$db->setAttribute(PDO::ATTR_ERRMODE, $tmp); 29 if (false != $ret) 30 printf("[002] Maybe PDO could indicate that this is not a proper way of setting the ERRMODE...%s\n", 31 var_export($ret, true)); 32 33 $ret = @$db->setAttribute(PDO::ATTR_ERRMODE, 'pdo'); 34 if (false != $ret) 35 printf("[003] Maybe PDO could indicate that this is not a proper way of setting the ERRMODE...%s\n", 36 var_export($ret, true)); 37 38 if (false != @$db->setAttribute(PDO::ATTR_ERRMODE, $invalid)) 39 printf("[004] Invalid ERRMODE should be rejected\n"); 40 41 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); 42 // no message for any PDO call but... 43 $db->query('THIS IS NOT VALID SQL'); 44 // ... still messages for everything else 45 $code = $db->errorCode(); 46 $info = $db->errorInfo(); 47 48 if ($code != '42000') 49 printf("[005] Expecting SQL code 42000 got '%s'\n", $code); 50 if ($code !== $info[0]) 51 printf("[006] Code and info should be identical, got errorCode() = %s, errorInfo()[0] = %s\n", 52 $code, $info[0]); 53 if ('' == $info[1]) 54 printf("[007] Driver specific error code not set\n"); 55 if ('' == $info[2]) 56 printf("[008] Driver specific error message not set\n"); 57 58 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 59 $db->query('THIS IS NOT VALID SQL'); 60 61 $code = $db->errorCode(); 62 $info = $db->errorInfo(); 63 64 if ($code != '42000') 65 printf("[009] Expecting SQL code 42000 got '%s'\n", $code); 66 if ($code !== $info[0]) 67 printf("[010] Code and info should be identical, got errorCode() = %s, errorInfo()[0] = %s\n", 68 $code, $info[0]); 69 if ('' == $info[1]) 70 printf("[011] Driver specific error code not set\n"); 71 if ('' == $info[2]) 72 printf("[012] Driver specific error message not set\n"); 73 74 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 75 try { 76 $line = __LINE__ + 1; 77 $db->query('THIS IS NOT VALID SQL'); 78 } catch (PDOException $e) { 79 80 $code = $db->errorCode(); 81 $info = $db->errorInfo(); 82 83 if ($code != '42000') 84 printf("[013] Expecting SQL code 42000 got '%s'\n", $code); 85 if ($code !== $info[0]) 86 printf("[014] Code and info should be identical, got errorCode() = %s, errorInfo()[0] = %s\n", 87 $code, $info[0]); 88 if ('' == $info[1]) 89 printf("[015] Driver specific error code not set\n"); 90 if ('' == $info[2]) 91 printf("[016] Driver specific error message not set\n"); 92 93 if ($e->getCode() !== $code) 94 printf("[017] Exception code '%s' differs from errorCode '%s'\n", 95 $e->getCode(), $code); 96 97 $msg = $e->getMessage(); 98 foreach ($info as $k => $v) { 99 if (false === stristr($msg, (string)$v)) { 100 printf("[018] Cannot find all parts of the error info ('%s') in the exception message '%s'\n", 101 $v, $msg); 102 } 103 } 104 105 if ($e->getLine() !== $line) 106 printf("[019] Exception has been thrown in line %d, exception object reports line %d\n", 107 $line, $e->getLine()); 108 109 if ($e->getFile() !== __FILE__) 110 printf("[020] Exception has been thrown in file '%s', exception object reports file '%s'\n", 111 __FILE__, $e->getFile()); 112 113 } 114 115 function my_handler($e) { 116 global $db, $line; 117 118 $code = $db->errorCode(); 119 $info = $db->errorInfo(); 120 121 if ($code != '42000') 122 printf("[021] Expecting SQL code 42000 got '%s'\n", $code); 123 if ($code !== $info[0]) 124 printf("[022] Code and info should be identical, got errorCode() = %s, errorInfo()[0] = %s\n", 125 $code, $info[0]); 126 if ('' == $info[1]) 127 printf("[023] Driver specific error code not set\n"); 128 if ('' == $info[2]) 129 printf("[024] Driver specific error message not set\n"); 130 131 if ($e->getCode() !== $code) 132 printf("[025] Exception code '%s' differs from errorCode '%s'\n", 133 $e->getCode(), $code); 134 135 $msg = $e->getMessage(); 136 foreach ($info as $k => $v) { 137 if (false === stristr($msg, (string)$v)) { 138 printf("[026] Cannot find all parts of the error info ('%s') in the exception message '%s'\n", 139 $v, $msg); 140 } 141 } 142 143 if ($e->getLine() !== $line) 144 printf("[027] Exception has been thrown in line %d, exception object reports line %d\n", 145 $line, $e->getLine()); 146 147 if ($e->getFile() !== __FILE__) 148 printf("[028] Exception has been thrown in file '%s', exception object reports file '%s'\n", 149 __FILE__, $e->getFile()); 150 151 if (get_class($e) != 'PDOException') 152 printf("[029] Expecting PDO exception got exception of type '%s'\n", get_class($e)); 153 154 print "\nend of execution"; 155 } 156 set_exception_handler('my_handler'); 157 $line = __LINE__ + 1; 158 $db->query('THIS IS NOT VALID SQL'); 159 160 print "done!\n"; 161--EXPECTF-- 162[003] Maybe PDO could indicate that this is not a proper way of setting the ERRMODE...true 163 164Warning: PDO::query(): SQLSTATE[42000]: Syntax error or access violation: %d You have an error in your SQL syntax; check the manual that corresponds to your %s server version for the right syntax to use near '%s' at line %d in %s on line %d 165 166end of execution