2013-08-13 3 views
2

Итак, у меня возникли проблемы с работой MySQL.PHP ошибки загрузки MySQL

Сервер Apache запущен, PHP установлен правильно, и мой статус сервера MySQL запущен.

Когда я звоню phpinfo(), он сообщает мне, где находится mysql.sock, и существует папка и файл.

Я бегу OSX 10.8.4

Я следую за этот учебник, чтобы попытаться получить представление о том, как будет работать чатов: http://www.ibm.com/developerworks/library/x-ioschat/

Так что, когда я бегу мой PHP скрипт, страница загружается с ошибками. Я новичок в PHP, и у меня сложная отладка времени, установка была особенно сложной.

Так что, если я держу тип содержимого: текст/XML раскомментирована Я получаю эту ошибку:

error on line 2 at column 1: Document is empty

Он также говорит мне, что страница отображается до первой ошибки, так что имеет смысл, что страница когда я загружаю его.

Когда прокомментировано, ошибки начинают иметь немного больше смысла; однако, учитывая мой абсолютный новичок в PHP, я не совсем уверен, как их перемещать.

Вот ошибки:

Notice: Undefined index: past in /messages.php on line 6

- Это имеет смысл, я думаю. Я еще не создал клиентскую сторону, поэтому не должно быть никакой переменной прошлого.

Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in /messages.php on line 16

--So, мой фон на стороне клиента, так что это говорит мне о том, что мой переменных $ результата имеет логическое значение, хранящееся в нем, вместо того, чтобы все, что должно быть в нем вызов mysql_fetch_assoc() функции. Поскольку инструкция else должна быть триггером, это означает, что либо mysql_query() не работает правильно, либо мой параметр для него неверен. Я не знаю, что (если есть), и я не знаю, как это решить.

Warning: mysql_free_result() expects parameter 1 to be resource, boolean given in /messages.php on line 24

--Again, то же, что и выше; полу-имеет смысл, очень не уверен, как это сделать.

Итак, после ошибок ничего не отображается ниже. Что имеет смысл, потому что условия написаны в предположении, что у них будет ресурс, а не логический (я думаю?)

В моем php-файле, если вы сравните его с учебником, вы увидите, что я вынул вызовы htmlentities(), потому что я читал в StackOverflow, что они не нужны, и они не меняли состояние ошибок, которые я получал в любом случае.

В любом случае, большое спасибо за любой совет/помощь! Вот мой код до сих пор:

chat.sql:

DROP TABLE IF EXISTS chatitems; 
CREATE TABLE chatitems (
id BIGINT NOT NULL PRIMARY KEY auto_increment, 
added TIMESTAMP NOT NULL, 
user VARCHAR(64) NOT NULL, 
message VARCHAR(255) NOT NULL 
); 

сообщения.PHP:

<?php 
ini_set('display_errors','1'); 
//header('Content-type: text/xml'); 
mysql_connect('localhost:/private/var/mysql/mysql.sock', 'root', ''); 
mysql_select_db('http://localhost/Documents/JoistChat/chat.sql'); 
if ($_REQUEST['past']) { 
    $result = mysql_query('SELECT * FROM chatitems WHERE id > '. 
    mysql_real_escape_string($_REQUEST['past']). 
    ' ORDER BY added LIMIT 50'); 
} else { 
    $result = mysql_query('SELECT * FROM chatitems ORDER BY added LIMIT 50');  
} 
?> 
<chat> 
<?php 
while ($row = mysql_fetch_assoc($result)) { 
?> 
<message added="<?php echo($row['added']) ?>" id="<?php echo($row['id']) ?>"> 
    <user><?php echo($row['user']) ?></user> 
    <text><?php echo($row['message'])?></text> 
</message> 
<?php 
} 
mysql_free_result($result); 
?> 
</chat> 

test.html:

<html> 
<head> 
<title>Chat Message Test Form</title> 
</head> 
<body> 
<form action="http://localhost/JoistChat/messages.php" 
method="POST"> 
User: <input name="user" /><br /> 
Message: <input name="message" /><br /> 
<input type="submit" /> 
</form> 
</body> 
</html> 
+0

1. Вы используете [** устаревший ** API баз данных] (http://stackoverflow.com/q/12859942/19068) и должны использовать [современную замену] (http://php.net/ ручной/EN/mysqlinfo.api.choosing.php). 2. Где вы видели, что «htmlentities» не нужны? Это необходимо (на самом деле, «htmlspecialchars» лучше), но по причинам, не связанным с проблемой, которую вы испытываете. См. [Этот вопрос] (http://stackoverflow.com/questions/1996122/how-to-prevent-xss-with-html-php/1996141#1996141). – DCoder

+0

3. Отладка 101: если вы получили значение, которое вы не ожидали (логическое), вернитесь туда, где вы приобрели это значение (в 'mysql_query()'), обратитесь к [руководству] (http: // us. php.net/mysql_query#refsect1-function.mysql-query-returnvalues), чтобы узнать, что приведет к возврату функции, оттуда. Также будут полезны комментарии пользователей на этой странице руководства. Эта конкретная ошибка, безусловно, входит в пятерку наиболее часто задаваемых вопросов по SO ... – DCoder

+1

+1 Хорошо заданный вопрос. Соответствующие детали, сообщения о кодах и ошибках, а также попытки понять/объяснить возникшие ошибки. – maxf130

ответ

2
$past = ''; 
if (!empty($_REQUEST['past'])) { 
    $past = 'WHERE id > '.intval($_REQUEST['past']); 
} 
$sql = 'SELECT * FROM chatitems $past ORDER BY added LIMIT 50' 
$result = mysql_query($sql) or trigger_error(mysql_error()." [$sql]");  

Вы должны изучить основы культуры кодирования. Основные принципы:

  1. Не повторяйте себя. Вы пишете всю информацию дважды
  2. Всегда проверяйте на наличие ошибки
  3. Не кладите слишком много кода в одну строку. Сделайте свой код разным, шаг за шагом. Нужна программа для создания SQL-запроса? Хорошо. получить произведение этого кода в переменной и передать его. Не сбрасывайте всю программу в одной строке.
  4. Форматирование SQL правильно

Таким образом, вы всегда будете знать причину этой проблемы и ваш код запуска гладкой и проще в обслуживании.

Также отметили, что ваш способ выбора базы данных довольно ... странный. «chat.sql» - это файл с кодом создания таблицы , а не базы данных. Сначала необходимо создать базу данных, затем создать в ней таблицу, затем выбрать новую созданную базу данных.

Как вы уже сказали, mysql ext устаревает. Вместо этого вы должны использовать PDO, поскольку это единственный выбор для пользователей PHP, единственной идеей взаимодействия с базами данных является прямой вызов API.

Во-первых, создать файл с параметрами подключения, pdo.php

<?php 
$dsn = "mysql:host=localhost;dbname=test;charset=utf8"; 
$opt = array(
    PDO::ATTR_ERRMODE   => PDO::ERRMODE_EXCEPTION, 
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC 
); 
$pdo = new PDO($dsn,'root','', $opt); 

Затем сделайте ваш код таким образом

<?php 
ini_set('display_errors','1'); 
//header('Content-type: text/xml'); 
include 'pdo.php'; 

$past = ''; 
$bind = array(); 
if (!empty($_REQUEST['past'])) { 
    $past = 'WHERE id > ?'; 
    $bind = array($_REQUEST['past']); 
} 
$sql = 'SELECT * FROM chatitems $past ORDER BY added LIMIT 50' 
$stm = $pdo->prepare($sql);  
$stm->execute($bind); 
$data = $stm->fetchAll(); 
?> 
<chat> 
<?php foreach ($data as $row) { ?> 
0

Поскольку индекс 'past' не установлен, логическое условие в случае -statement оценивает значение false. В результате выполнена часть else.

Ваши сообщения об ошибках сказать, что запрос

SELECT * FROM chatitems ORDER BY added LIMIT 50 

привели к ошибке SQL. Попробуйте запустить этот запрос в своем клиенте MySql напрямую, чтобы узнать, что такое ошибка. Я предполагаю, что таблица/база данных, к которой вы обращаетесь, не создается/не выбирается.

Смежные вопросы