2

所以,我在让 MySQL 工作时遇到了一些麻烦。

我的 Apache 服务器已启动并正在运行,PHP 已正确安装,并且我的 MySQL 服务器状态正在运行。

当我调用phpinfo()它时,它会告诉我 mysql.sock 所在的位置,文件夹和文件都存在。

我正在运行 OSX 10.8.4

我正在按照本教程尝试了解聊天的工作原理:http: //www.ibm.com/developerworks/library/x-ioschat/

因此,当我运行我的 php 脚本时,页面加载时出现错误。我是 PHP 新手,调试困难,安装特别麻烦。

因此,如果我保留 content-type: text/xml 未注释,我会收到此错误:

第 2 行第 1 列的错误:文档为空

它还告诉我页面被渲染到第一个错误,所以当我加载它时页面是空白的是有道理的。

当它被评论时,错误开始变得更有意义。但是,鉴于我对 PHP 的绝对新手本性,我不确定如何导航它们。

以下是错误:

注意:未定义的索引:第 6 行 /messages.php 中的过去

——我认为这是有道理的。我还没有建立客户端,所以应该没有提供过去的变量。

警告:mysql_fetch_assoc() 期望参数 1 是资源,布尔值在第 16 行的 /messages.php 中给出

mysql_fetch_assoc()--所以,我的背景是客户端,所以这告诉我的是我的 $result 变量中存储了一个布尔值,而不是函数调用中应该包含的任何内容。由于 else 语句应该触发,这意味着要么mysql_query()工作不正常,要么我的参数不正确。我不知道哪个(如果有的话),也不知道解决方案。

警告:mysql_free_result() 期望参数 1 是资源,在第 24 行的 /messages.php 中给出布尔值

--再次,同上;半有意义,非常不确定如何修复它。

因此,在出现错误之后,下面不会显示任何内容。这是有道理的,因为条件是在假设它们将具有资源而不是布尔值的情况下编写的(我认为??)

在我的 php 文件中,如果您将其与教程进行比较,您会看到我取消了htmlentities()调用,因为我在 StackOverflow 上读到它们不需要它们,并且它们并没有改变我遇到的错误的状态。

无论如何,非常感谢您提供的任何建议/帮助!到目前为止,这是我的代码:

聊天.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>

测试.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>
4

2 回答 2

3
$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) { ?>
于 2013-08-13T06:51:01.243 回答
0

由于'past'未设置索引,因此 if 语句中的布尔条件评估为 false。结果,该else部分被执行。

您的错误消息告诉您查询

SELECT * FROM chatitems ORDER BY added LIMIT 50

导致 SQL 错误。尝试直接在您的 MySql 客户端中运行该查询以查看错误是什么。我的猜测是您正在访问的表/数据库未创建/选择。

于 2013-08-13T06:53:12.793 回答