Я использовал функции assert пользователя, такие как:
debug_assert (
gettype($ob)=='object',
"Not an object <pre>".print_r($ob,1).'</pre>'
) or exit;
но я обнаружил, что print_r изменяет результаты $ mysqli-> disabled_rows при вызове на $ mysqli: он сбрасывает влияет_первых с предыдущего ‘n’ на -1.
Тестовый код:
$q= "INSERT INTO t_envois SET id_contact=243";
if (!$mysqli) die ("missing mysqli");
$ok = $mysqli->query($q);
if (!$ok) die ("bad query $q : ".$mysqli->errno.") ".$mysqli->error);
function get_affected_rows() {
global $mysqli;
return $mysqli->affected_rows;
}
echo "1) ".($mysqli->affected_rows)."<br>"; // 1
echo "2) ".($mysqli->affected_rows)."<br>"; // 1
echo "3) ".get_affected_rows()."<br>"; // 1 try other function
echo "4) ".get_affected_rows()."<br>"; // 1 (no issue)
echo "5) ".(print_r($mysqli,1))."<br>"; // affected_rows shown as 1
echo "6) ".($mysqli->affected_rows)."<br>"; // -1 CHANGED !!
echo "7) ".get_affected_rows()."<br>"; // -1 etc
Как можно изменить результат с 1 на -1 при вызове print_r? Существуют ли другие не-sql функции, которые изменяют поля $ mysqli? Есть ли способ избежать этого?
Как сказал @Progman, это связано с давней ошибкой php: http://bugs.php.net/bug.php?id=67348
stat, print_r, var_dump и, возможно, другая функция, которая вызывает ‘stat’, сбрасывает действие selected_rows в -1.
В моем случае обходным путем было переписать фиксированную функцию print_r:
function print_it($thing) {
if ((gettype ($thing) == 'object')
and (get_class($thing) == 'mysqli'))
echo "...\naffected_rows => ".$thing->affected_rows."...";
else
print_r($thing);
}
Других решений пока нет …