所以,我在让 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 未注释,则会收到此错误:
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
--所以,我的背景是客户端,所以这告诉我的是我的 $result 变量中存储了一个 bool 值,而不是 mysql_fetch_assoc()
中应该包含的任何内容。函数调用。由于 else 语句应该触发,这意味着 mysql_query()
工作不正常,或者我的参数不正确。我不知道是哪一个(如果有的话),也不知道其中任何一个的解决方案。
Warning: mysql_free_result() expects parameter 1 to be resource, boolean given in /messages.php on line 24
--同样,同上;半有道理,非常不确定如何修复它。
因此,出现错误后,下面不会显示任何内容。这是有道理的,因为条件是在假设它们中有资源的情况下编写的,而不是 bool 值(我认为??)
在我的 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
);
messages.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>
最佳答案
$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]");
您需要学习基本的编码文化。基本准则是
- 不要重复自己的话。你把所有的东西都写了两遍
- 始终检查错误
- 不要在一行中堆叠太多代码。一步一步让你的代码与众不同。需要一个程序来创建 SQL 查询吗?好的。获取此代码的乘积并将其传递到变量中。不要将所有程序折叠在一行中。
- 正确设置 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) { ?>
关于PHP 加载 MySQL 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18202266/