我有一个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>";
}
}
?>
答案 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相同。