Каждый раз, когда вы получаете ...
"Warning: mysqli_fetch_object () ожидает, что параметр 1 будет mysqli_result, boolean задан«
blockquote>... это, вероятно, из-за проблемы с вашим запросом.
prepare()
илиquery()
могут возвращатьFALSE
(логическое), но это общее сообщение об отказе не оставляет вас в стороне от подсказок. Как вы узнаете, что не так с вашим запросом? Вы задаете !Прежде всего убедитесь, что сообщения об ошибках включены и видны: добавьте эти две строки в начало файла (ов) сразу после открытия
<?php
:error_reporting(E_ALL); ini_set('display_errors', 1);
Если ваше сообщение об ошибках установлено в php.ini, вам не придется беспокоиться об этом. Просто убедитесь, что вы обрабатываете ошибки изящно и никогда не раскрываете истинные причины каких-либо проблем для ваших пользователей. Выявление истинной причины для общественности может быть приглашением на золото с гравировкой для тех, кто хочет нанести вред вашим сайтам и серверам. Если вы не хотите отправлять ошибки в браузер, вы всегда можете следить за журналами ошибок веб-сервера. Расположение журналов будет варьироваться от сервера к серверу, например, на Ubuntu журнал ошибок обычно находится в
/var/log/apache2/error.log
. Если вы изучаете журналы ошибок в среде Linux, вы можете использоватьtail -f /path/to/log
в окне консоли, чтобы видеть ошибки, когда они происходят в режиме реального времени .... или как вы их делаете.Как только вы 'squared away на стандартном сообщении об ошибках, добавляющем проверку ошибок в вашем соединении с базой данных, и запросы дадут вам гораздо более подробную информацию о проблемах. Посмотрите на этот пример, где имя столбца неверно. Во-первых, код, возвращающий роковое сообщение об ошибке:
$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?"; $query = $mysqli->prepare($sql)); // assuming $mysqli is the connection $query->bind_param('s', $definition); $query->execute();
Ошибка является общей и не очень помогает вам в решении того, что происходит.
С помощью пары больше строк кода вы можете получить очень подробную информацию, которую вы можете использовать для решения проблемы сразу . Проверьте утверждение
prepare()
для правдивости, и если это хорошо, вы можете перейти к привязке и исполнению.$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?"; if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection $query->bind_param('s', $definition); $query->execute(); // any additional code you need would go here. } else { $error = $mysqli->errno . ' ' . $mysqli->error; echo $error; // 1054 Unknown column 'foo' in 'field list' }
Если что-то не так, вы можете выплюнуть сообщение об ошибке, которое приведет вас к проблеме , В этом случае в таблице нет столбца
foo
, решение проблемы тривиально.Если вы выберете, вы можете включить эту проверку в функцию или класс и расширить ее, обработав ошибки изящно, как упомянутых ранее.
Вы должны избегать этого (в конце вашего кода):
{?>
и это:
<?php}
Вы не должны устанавливать скобки непосредственно близко к открытому / close php
, но он разделен пробелом:
{ ?>
<?php {
также избегает <?
и использует <?php
Я видел некоторые ошибки, которые я исправил ниже.
Это то, что я получил как ошибочное:
if (login())
{?>
<h2>Welcome Administrator</h2>
<a href=\"upload.php\">Upload Files</a>
<br />
<a href=\"points.php\">Edit Points Tally</a>
<?php}
else
{
echo "Incorrect login details. Please login";
}
Так я бы это сделал:
<html>
some code
<?php
function login()
{
if (empty ($_POST['username']))
{
return false;
}
if (empty ($_POST['password']))
{
return false;
}
$username = trim ($_POST['username']);
$password = trim ($_POST['password']);
$scrambled = md5 ($password . 'foo');
$link = mysqli_connect('localhost', 'root', 'password');
if (!$link)
{
$error = "Unable to connect to the database server";
include 'error.html.php';
exit ();
}
if (!mysqli_set_charset ($link, 'utf8'))
{
$error = "Unable to set database connection encoding";
include 'error.html.php';
exit ();
}
if (!mysqli_select_db ($link, 'foo'))
{
$error = "Unable to locate the foo database";
include 'error.html.php';
exit ();
}
$sql = "SELECT COUNT(*) FROM admin WHERE username = '$username' AND password = '$scrambled'";
$result = mysqli_query ($link, $sql);
if (!$result)
{
return false;
exit ();
}
$row = mysqli_fetch_array ($result);
if ($row[0] > 0)
{
return true;
}
else
{
return false;
}
}
if (login())
{
echo '<h2>Welcome Administrator</h2>
<a href=\"upload.php\">Upload Files</a>
<br />
<a href=\"points.php\">Edit Points Tally</a>';
}
else
{
echo "Incorrect login details. Please login";
}
?>
some more html code
</html>
У меня была такая же ошибка, но я исправил ее, изменив файл php.ini
.
Найти файл php.ini см. в Чувак, где мой php.ini?
, затем откройте его с помощью вашего любимого редактора.
Найдите свойство short_open_tag
и примените следующее изменение:
; short_open_tag = Off ; previous value
short_open_tag = On ; new value
Избегайте этого <? } ?>
, убедитесь, что вы положили <?php } ?>
Просто зайдите в php.ini, затем найдите short_open_tag= Off
в short_open_tag= On
Я столкнулся с этой проблемой, когда оставил php foreach: тег закрыт.
<?php foreach($many as $one): ?>
Закрытие его с помощью после устранения синтаксической ошибки: unexpected end of file
<?php endforeach; ?>
Надеюсь, что это поможет кому-то
Кроме того, в другом случае, когда трудно определить, есть ли у вас файл с только функцией, я знаю, что это не обычный случай использования, но он раздражает и должен был обнаружить ошибку.
<?php
function () {
}
Файл, приведенный выше, возвращает erro Parse error: syntax error, unexpected end of file in
, а ниже - нет.
<?php
function () {
};
Убедитесь, что вы закрыли свой класс.
Например, если у вас есть класс контроллера с методами, и случайно вы удаляете конечную скобку, которая закрывает весь класс, вы получите эту ошибку.
class someControler{
private $varr;
public $varu;
..
public function method {
..
}
..
}// if you forget to close the controller, you will get the error
также, найдите комментарий //, который разбивает закрытие фигурной скобки
if (1==1) { //echo "it is true"; }
, закрывающая фигурная скобка не будет правильно закрывать условный раздел, а php не будет правильно обработать оставшуюся часть кода.
У меня была такая же ошибка, но я исправил ее, изменив php.ini и / или отредактировав файл PHP!
blockquote>Есть два разных способа обойти синтаксис синтаксического анализа.
Способ 1 (ваш файл PHP)
Избегайте в вашем файле PHP этого:
<? } ?>
Убедитесь, что вы так выразились
<?php ?>
Ваш код содержит
<? ?>
ПРИМЕЧАНИЕ: Отсутствует
< / blockquote>php
после<?
!Способ 2 (файл php.ini)
Существует также простой способ решить вашу проблему. Найдите значение свойства
short_open_tag
(используйте в текстовом редакторе с помощьюCtrl + F
!) [/ G2] и примените следующее изменение:; short_open_tag = Off
-
short_open_tag = On
Согласно описанию основных директив php.ini ,
short_open_tag
позволяет использовать короткий открытый тег (<?
), хотя это может вызвать проблемы при использовании с xml (<?xml
не будет работать, если это включено)!ПРИМЕЧАНИЕ: Перезагрузите свой сервер (например, Apache) и перезагрузите веб-страницу PHP в своем браузере.
< / BLOCKQUOTE>
Если ваш файл parse_ini_file ($ file) или подпрограмма испускает файл .ini, проверьте, не указаны ли данные в файле ini. Неучетные данные вызовут эту ошибку. Ex; data1 = test вызовет ошибку, data1 = "test" не будет.