PHP 加载 MySQL 时出错

标签 php html mysql apache

所以,我在让 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]");    

您需要学习基本的编码文化。基本准则是

  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) { ?>

关于PHP 加载 MySQL 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18202266/

相关文章:

php - 在 woocommerce 中设置自定义订单状态

html - 仅将居中图像作为链接,而不是整个父 div

php - MySql 查询在非常大的表上变慢

mysql - 通过 SQL 枚举组合

php - 重复的 cookie

php - 与 Laravel 一起使用时如何从关系表中选择计数

php - PHP计算后如何保留小数位?

javascript - 从 Javascript 写入 HTML 文件

mysql - 从 MySQL 到 HTML 服务器站点的 WMD Markdown 不显示文本区域

php - IN 子句仅返回 1 行