W moim środowisku lokalnym / programistycznym kwerenda MySQLi wykonuje OK. Jednak po przesłaniu go do mojego środowiska hostingowego pojawia się następujący błąd:
Błąd krytyczny: wywołanie funkcji składowej bind_param () na obiekcie nie-obiektowym w ...
Oto kod:
global $mysqli;
$stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?");
$stmt->bind_param("i", $cur_id);
$stmt->execute();
$stmt->bind_result($uid, $desc);
Aby sprawdzić moje zapytanie, próbowałem wykonać zapytanie za pomocą panelu sterowania phpMyAdmin, a wynik jest OK.
Odpowiedzi:
63 dla odpowiedzi № 1Przede wszystkim zawsze miej ten wiersz przed połączeniem MySQLi wszystko twoje środowiska:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Następnie wszystkie błędy MySQL zostaną przesłanedo wyjątków PHP. Nieprzestrzeganie wyjątku z kolei powoduje błąd krytyczny PHP. Tak więc, w przypadku błędu MySQL, otrzymasz zwykły błąd PHP, który natychmiast powiadomi Cię o przyczynie błędu, a ślad stosu doprowadzi Cię do miejsca, w którym wystąpił błąd.
Pamiętaj, że musisz być w stanie zobaczyć Ogólnie błędy PHP. I tu rzeczywiście chodzi o różne środowiska:
W witrynie na żywo musisz przejrzeć dzienniki błędów, więc ustawienia muszą być
error_reporting(E_ALL); ini_set("display_errors", 0); ini_set("log_errors", 1);
Podczas pracy na lokalnym serwerze programistycznym można popełnić błędy na ekranie:
error_reporting(E_ALL); ini_set("display_errors", 1);
I mała lista tego, co ty nie powinieneś:
- Użyj operatora tłumienia błędów (
@
) - Posługiwać się
die()
lubecho
lub jakąkolwiek inną funkcję drukowania bezwarunkowego komunikatu o błędzie na ekranie. PHP może już to wszystko poprawić, pomoc nie jest wymagana. - Testowanie wyniku zapytania ręcznie (np
if($result)
) po prostu nie ma sensu. Zapytanie nie powiodło się, a otrzymasz wyjątek błędu lub wszystko było w porządku i nie ma nic do przetestowania. - Użyj polecenia try..catch, aby wyświetlić komunikat o błędzie. Znowu PHP może to zrobić lepiej, o wiele lepiej.