用php内容替换div

时间:2011-03-30 19:31:25

标签: php mysql sql

我有一个div。当我点击任何子元素列表项时,我发布项目号。到一个php文件,显示与该列表项对应的一些细节。但有两个问题:

首先,我想用php文件的内容替换div .. 第二,我在处理php文件时遇到错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

div看起来像:

<div id="list">
            <?php

            $query = "SELECT * from workflow WHERE name = '$username' ORDER BY msg_id DESC";
            $result = mysql_query($query) or die("ERROR: $query.".mysql_error());

                while ($row = mysql_fetch_object($result)) {
                    echo "<div class=list-item-wrap>";
                    echo "<a href='#'><input class=msgid type=hidden value=".$row->msg_id."><div class=list-item>";
                    echo "<b><h1>".$row->subject."</h1></b>".substr($row->message, 0, 200)."...<br><b>".$row->sender."</b>";
                    echo "</div></a></div>";
                }
            ?>
                <br>
            </div>


    </div>

php文件看起来像:

<?php
include 'header.php';

$msg_id = $_POST['msg_id'];
//$msg_id = 1;

$query = "SELECT * from workflow WHERE msg_id = $msg_id";
$result = mysql_query($query) or die (mysql_error());
        //echo $row->username;

if (mysql_num_rows($result) > 0){
    while ($row = mysql_fetch_object($result)) {
        echo "<div id=display-wrap>";
        echo "<h1>".$row->sender."</h1><br>";
        echo "<h2>".$row->subject."</h2>";
        echo "<h3>".$row->datetime."</h3><br>";
        echo "<h3>".$row->message."</h3><br>";
        echo "</div>";
    }
}

?>

3 个答案:

答案 0 :(得分:1)

好的,我环顾四周,发现这个问题在2个月后仍未得到答复。到此为止。

首先关闭:您在第二个文件中的查询看起来没问题, if(和 if)$_POST['msg_id']是一个数字。但由于您没有对此处的值进行任何引用或转义或验证,因此您无法保证这一点。设置$msg_id类似

$msg_id = intval($_POST['msg_id']);

如果msg_id应该是int,则要处理该问题。任何不是数字的东西都将变为零,如果您愿意,可以轻松检查未设置或无效的值。 (这假设您的ID永远不会合法地为零,这是具有auto_increment ID字段的表中的有效假设。)如果msg_id除了数字之外的任何内容,则需要将查询更改为看起来像

$msg_id_sql = mysql_real_escape_string($msg_id);
$query = "SELECT * from workflow WHERE msg_id = '$msg_id_sql'";

其次:检查以确保$username具有值,并且第一个脚本生成的HTML是正确的。此外,您应该将其转义(使用{{1} },如上所述)在查询中使用它之前,特别是如果它来自用户。既然你没有在这里发布任何关于它的信息,那么你需要自己做。你要做的事情看起来很奇怪,真的......隐藏的字段不是很有用,除非你提交他们所在的表格(这将重新加载页面,打败所有ajax的目的)。

第三:要进行实际的检索和替换,我建议使用jQuery。 mysql_real_escape_string很常见,但不是标准的。有些浏览器支持它,有些浏览器不支持...并且jQuery隐藏了这些差异(以及隐藏处理异步表单帖子的复杂性等)。示例jQuery代码(可能需要或可能不需要进行细微更改;我没有方便的测试内容):

innerHTML

我不打算在vanilla JS中讨论如何做到这一点。 (我可以,如果绝对必要,但是呃 - 这至少是代码的4-5倍。)如果你真的想在没有jQuery的情况下这样做,请谷歌$.post('second_page.php', { msg_id: some_msg_id_to_retrieve }, function(data) { $('#the_results_div_id').html(data); } ); (对于检索部分)和{ {1}}(用你自己的东西替换div的内容)。

第四:XMLHttpRequest和朋友们的方式,他们已经过了巅峰时期,应该被拖出去拍摄。 (无论是谁教你使用它们都应该也是这样,考虑到他已经成为问题的一部分。:P) Google innerHTML(PHP数据对象)和/或mysql_query ;两者都提供称为“预备语句”的功能,允许您将查询和数据分开。这种分离提供了许多好处 - 一个是您可以安全地构建和运行查询,而不必担心数据的外观。 (只要你不是那些依赖于魔法引用的idjits之一。如果你这样做,坦率地说,你已经很好地搞砸了。当你最不期望它时,魔术引用做错了,使得SQL注入几乎是不可避免的。 )

无论如何,我更喜欢PDO,但要么比PDO函数更好。

答案 1 :(得分:-3)

嗯,尝试清理SQL

$query = "SELECT * FROM `workflow` WHERE `name` = '$username' ORDER BY `msg_id` DESC";

它也可能是您在变量$ username中输入的内容。

就更新div的内容而言,AJAX是我认为最简单的解决方案。

答案 2 :(得分:-4)

在您的查询中尝试更改

$query = "SELECT * from workflow WHERE name = '$username' ORDER BY msg_id DESC";

$query = "SELECT * from workflow WHERE name = '".$username."' ORDER BY msg_id DESC";

与msg id相同。