加载MySQL时出现PHP错误

加载MySQL时出现PHP错误,php,html,mysql,apache,Php,Html,Mysql,Apache,所以,我在让MySQL正常工作方面遇到了一些麻烦 我的Apache服务器已启动并运行,PHP已正确安装,MySQL服务器状态为运行 当我调用phpinfo()时,它会告诉我mysql.sock在哪里,文件夹和文件都存在 我正在运行OSX 10.8.4 我遵循本教程试图了解聊天的工作原理: 因此,当我运行php脚本时,页面会加载错误。我是PHP新手,调试时遇到困难,安装特别麻烦 因此,如果我保持content type:text/xml未注释,则会出现以下错误: 第1列第2行出错:文档为空 它还告

所以,我在让MySQL正常工作方面遇到了一些麻烦

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

当我调用
phpinfo()
时,它会告诉我mysql.sock在哪里,文件夹和文件都存在

我正在运行OSX 10.8.4

我遵循本教程试图了解聊天的工作原理:

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

因此,如果我保持content type:text/xml未注释,则会出现以下错误:

第1列第2行出错:文档为空

它还告诉我,页面呈现到第一个错误,因此加载页面时页面为空白是有意义的

当它被注释时,错误开始变得更有意义;然而,考虑到我对PHP绝对是新手,我真的不知道如何浏览它们

以下是错误:

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

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

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

--因此,我的背景是客户端,这告诉我$result变量中存储了一个布尔值,而不是
mysql\u fetch\u assoc()
函数调用中应该存储的值。由于else语句应该触发,这意味着要么
mysql\u query()
工作不正常,要么我的参数不正确。我不知道是哪一个(如果有),也不知道这两个问题的解决方案

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

--同样,如上所述;semi是有意义的,非常不确定如何着手修复它

因此,在错误发生后,下面不会显示任何内容。这是有意义的,因为条件是在假设它们将有一个资源的情况下编写的,而不是布尔值(我认为??)

在我的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
);
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>

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

  • 不要重复你自己。你把所有的东西都写了两遍
  • 始终检查错误
  • 不要在一行中堆叠太多代码。一步一步地使代码清晰。需要一个程序来创建SQL查询吗?可以在变量中获取此代码的乘积并传递它。不要在一行中折叠所有程序
  • 正确格式化SQL
  • 通过这种方式,您将始终知道问题的原因,并使代码运行顺畅且易于维护

    还注意到,您选择数据库的方式是相当复杂的。。。奇怪“chat.sql”是一个带有表创建代码的文件,而不是数据库。您必须首先创建一个数据库,然后在其中创建一个表,然后选择NewCreatedDatabase

    正如已经告诉您的,mysql ext已经过时。您必须改用PDO,因为它是PHP用户的唯一选择,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);
    
    prepare($sql);
    $stm->execute($bind);
    $data=$stm->fetchAll();
    ?>
    
    由于未设置
    'pass'
    索引,if语句中的布尔条件的计算结果为false。因此执行
    else
    部分

    您的错误消息告诉您,查询

    SELECT * FROM chatitems ORDER BY added LIMIT 50
    

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

    1。您正在使用并且应该使用。2.您在哪里看到不需要
    htmlentities
    ?它是需要的(实际上,
    htmlspecialchars
    更好),但原因与您遇到的问题无关。见表3。调试101:如果你得到了一个你没有预料到的值(一个布尔值),回到你得到这个值的地方(到
    mysql\u query()
    ),查看是什么导致函数返回这个值,从那里开始。该手册页面中的用户评论也会有所帮助。这一具体错误肯定在SO…+1个提问良好的问题的前5个最常见问题中。相关详细信息、代码和错误消息,以及理解/解释产生的错误的尝试。首先,您必须创建一个数据库可能的副本
    <?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) { ?>
    
    SELECT * FROM chatitems ORDER BY added LIMIT 50