【问题标题】:AJAX chat system not workingAJAX 聊天系统不工作
【发布时间】:2014-01-13 10:05:04
【问题描述】:

我似乎无法解决这个问题。改写了几天还是没有进展。

这是 Javascript(与 html 在同一页面上)

总结:用户在输入框中输入文本。将其发送出去进行处理,然后将其发送回并显示在屏幕上,在 html 页面上的 ID 为 DisplayText 的框中。

<script type="text/javascript">
    function SendText() {
        if (document.getElementById("Text").innerHTML == "") {
            return;
        } else
        {
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.onreadystatechange = function() {
                if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                    document.getElementById("DisplayText").innerHTML = xmlhttp.responseText;
                }
            }
            Text = document.getElementById("Text").value;
            xmlhttp.open("GET", "php/Test.php?Chat=" + Text, true);
            xmlhttp.send();
        }
    }
</script>

这是 HTML(与脚本相同的页面)

<div>
    <p>
        <span id="DisplayText">
            TEXT GOES HERE
        </span>
    </p>
</div>
<form action="" onsubmit="SendText();">
    <input type="" name="" id="Text" />
    <input type="submit" value="Send" name="Send" />
</form>

PHP代码在这里

<?php
session_start();
include ("Connect.php");
$Connection = mysqli_connect("localhost", "root", "", "chatsystem");
$Create = "CREATE TABLE " . $_SESSION["Username"] . "Chat(Username VARCHAR(255), Chat VARCHAR(255))";
////////////////////////////////////////////////////////////////////////////////
$DatabaseExist = $Connection->query("SELECT 1 FROM " . $_SESSION["Username"] . "Chat");
if ($DatabaseExist !== false) {
    echo "Database exists";
    doSomething();
} else {
    echo "Database does not exist";
    mysqli_query($Connection, $Create);
    doSomething();
}
////////////////////////////////////////////////////////////////////////////////
function doSomething() {
    // Get the sent chat
    $Input = $_REQUEST["Chat"];
    // Insert into the database the new chat sent
    mysqli_query($Connection, "INSERT INTO " . $_SESSION["Username"] . "chat (`Username`, `Chat`) VALUES ('$_SESSION[Username], '$Input')");
    // Select everything from the database
    $Result = $Connection->query("SELECT * FROM " . $_SESSION["Username"] . "Chat");
    // Display everything from the database in an orderly fashion
    // --
    // For the length of the database
    // Append to a variable the next table row
    // --
    while ($Row = $Result->fetch_array()) {
        // Make Variable accessable
        global $Input;
        // Append username to the return value
        $Input = $Input . $Row["Username"] . " : ";
        // Append chat to the return value
        $Input = $Input . $Row["Chat"] . "<br />";
    }
}
// Will return the value
echo $Input;
?>

我与数据库的连接很好。我在其他有效的页面上使用它。 所以让我们假设这不是问题。 :P

任何知道或能想到错误的人提供的任何帮助或见解,我将不胜感激。 我是 AJAX 新手。

【问题讨论】:

  • 就 ajax 问题而言,为此目的使用 javascript 框架(推荐使用 JQuery)。请参阅本教程,techoctave.com/c7/posts/… 了解长轮询技术。

标签: javascript php html ajax mysqli


【解决方案1】:

你做错了测试

if (document.getElementById("Text").innerHTML == "")

它应该与您在 AJAX 中获取用于发送的文本的方式相同

if (document.getElementById("Text").value == "")

所以检查它的value 属性而不是它的innerHTML,因为input 元素没有html 内容..


但要小心,因为您的代码对SQL injection attacks 是开放的。

【讨论】:

  • 我正在尝试让它工作,然后我要从除字母和数字之外的所有字符中删除文本,这应该处理一些 SQL 注入攻击?但是,感谢您提供此代码。它帮助我能够调试它。
  • @Hamedar 对注入的最佳保护是使用准备好的语句,只接受用户输入作为参数而不是字符串连接..
  • 如果我去除所有非字母和/或数字字符,保护是否足以阻止任何和所有注入攻击?这样他们就没有能力使用 php 和/或 sql 编码?如果他们不能与数据库通信,他们就不会导致任何问题。但是我明白你的意思,准备好的语句只会删除任何和所有做任何事情的能力。
  • @Hamedar 最有可能......但在服务器端对吗?并且仅当在您的 sql 中使用数据作为字符串以便将它们包装在 ' 中时才有效。例如,您的 $_SESSION["Username"] 也可能被滥用于 sql 注入。还要注意编码字符串。黑客可以使用许多技巧来绕过保护。
  • 他们是另一种不易受到攻击来处理登录的方式吗?我只知道会话存储来做到这一点。否则,您如何检查用户每次访问新页面时是否已登录?我想Cookies可以做到吗?这样,您还可以在他们离开页面后让他们保持登录状态。但是 cookie 对会话有什么样的保护呢?
【解决方案2】:

第一个:使用输入的value 属性而不是innerHTML

例如。使用

if (document.getElementById("Text").value == "")

而不是

if (document.getElementById("Text").innerHTML == "")

2nd : 在表单的onsubmit 事件中使用return false;;在您使用 ajax 时防止刷新当前页面。否则页面将被刷新,并且不会显示 php 页面的输出,

例如。使用

onsubmit="SendText(); return false;"

而不仅仅是

onsubmit="SendText();"

【讨论】:

  • 由于您的回答给我的意见最多,我已将其标记为答案。由于这两个答案,我的休息时间减少了一点,试图弄清楚为什么它令人耳目一新将是一场斗争。所以谢谢你。
  • @GabyakaG.Petrioli 嗯嗯,但是 sql 注入是服务器端的问题;这不是问题的一部分。
  • @BhaveshGangani 我很抱歉...该评论应该转到我自己的回答中的评论...对此感到抱歉..
【解决方案3】:

【讨论】:

  • 很好读。肯定会使用它的资源来帮助我。谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-12-29
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 2015-12-29
  • 2023-03-03
相关资源
最近更新 更多