【问题标题】:PHP errors loading MySQL加载 MySQL 的 PHP 错误
【发布时间】:2013-08-13 06:39:15
【问题描述】:

所以,我在让 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 的绝对新手本性,我不确定如何导航它们。

以下是错误:

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

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

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

--所以,我的背景是客户端,所以这告诉我的是我的 $result 变量中存储了一个布尔值,而不是 mysql_fetch_assoc() 函数调用中应该包含的任何内容。由于 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
);

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>

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>

【问题讨论】:

  • 1.您正在使用an obsolete database API,应该使用a modern replacement。 2、你在哪里看到不需要htmlentities?它是必需的(实际上,htmlspecialchars 更好),但原因与您遇到的问题无关。见this question
  • 3.调试 101:如果你得到一个你没想到的值(一个布尔值),回到你获得这个值的地方(到 mysql_query()),咨询 the manual 看看是什么导致函数返回,从那里。该手册页中的用户 cmets 也会有所帮助。这个特定的错误绝对是关于 SO...的 5 个最常见问题...
  • +1 问得好问题。相关细节、代码和错误消息,以及尝试理解/解释产生的错误。
  • 首先你必须创建一个数据库

标签: php html mysql apache


【解决方案1】:
$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) { ?>

【讨论】:

    【解决方案2】:

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

    您的错误消息告诉您查询

    SELECT * FROM chatitems ORDER BY added LIMIT 50
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      相关资源
      最近更新 更多