0

我正在编写的程序和我试图实现的功能

好的。所以我现在写的是一个非常简单的论坛,在 Javascript 中使用 AJAX。我的部分任务是使用我的讲师用 PHP 为我们编写的 API 添加新帖子。请注意,API 和 SQL 数据库是完全本地的。

我用来添加这篇文章的功能是:

function addPosts()
{
// Add the new thread to the SQLlite database.
var treq = new Request({
    url:'guestbook/control.php?action=insertPost',
    'method':'post',
    onSuccess: function() {
        alert('win');
    },
    onFailure: function() {
        alert('fail');
    }
}).send(Object.toQueryString({
    // Had to convert it to a query string because it wouldn't work as a normal object.

    // These are the required values to send, to store a "post" in the database.
    'name':'This is a name',
    'comment':'This is a comment!'
}));
}

我知道这将每次添加相同的数据。我只是想让这该死的东西工作!

问题

发生的事情是,当调用这个函数时,我得到一个 SQL 语法错误。我很困惑,因为这意味着我的讲师的代码是错误的。在与我的讲师交谈后,他解释说当发布数据未正确发送到 PHP 代码时会发生这种情况。所以我开始使用谷歌浏览器的开发者工具来看看发生了什么,这就是我发现的:

帖子数据截图

现在对我来说,这意味着数据已成功加载到请求中,并且可以很好地传递给 PHP 文件。显然我错了。我一直在绞尽脑汁试图完成这项工作。

我知道这个 API 工作正常,因为我班上的其他人都没有遇到任何问题,而且我使用的代码实际上是抄袭了笔记中的代码,所以我有 90% 的把握是正确到。

需要注意的一点是onSuccess密钥中的代码运行,所以我知道这在 AJAX 方面不是问题。

另一件事是,这段代码在大学里的那些计算机上工作,自从我把它带回家后,它就决定不工作了。

堆栈跟踪

致命错误:未捕获的异常 'PDOException' 带有消息 'SQLSTATE[HY000]:一般错误:1 接近“)”:G:\Ajax Coursework\guestbook\php\database.php:134Stack trace:#0 G: \Ajax Coursework\guestbook\php\database.php(134): PDO->prepare('INSERT INTO pos...')#1 G:\Ajax Coursework\guestbook\php\class.GuestBook.php(44): DatabaseHandler->insert(Array)#2 G:\Ajax Coursework\guestbook\control.php(8): GuestBook->insert(Array)#3 G:\Ajax Coursework\guestbook\control.php(56): insertPost( )#4 {main} 在第 134 行的 G:\Ajax Coursework\guestbook\php\database.php 中抛出

4

2 回答 2

0

Object.toQueryString 用于将对象转换为查询字符串。因此,如果服务器要求同时设置 $_POST['name'] 和 $_POST['comment'],则不会。

坦率地说,因为您要发布它,我认为 $_GET['name'] 或 $_GET['comment'] 也不会设置。

Request.send 需要一个对象。您正在向它发送一个字符串。所以应该是 Request.send({prop: 'value'}),而不是 Request.send(value)。

帮自己一个忙,用下面的 php 代码做一个 PHP,看看它返回什么。它可能会立即为您解决这个问题。我感觉除了 $_GET['action'] 什么都没有发送

<?php
echo '<pre>';
print_r($_GET);
print_r($_POST);
echo '</pre>';
?>
于 2013-03-22T02:08:28.367 回答
0

以防万一有人偶然发现这个线程寻找答案:

function addPosts()
{
// Add the new thread to the SQLlite database.
var treq = new Request({
    url:'guestbook/control.php?action=insertPost',
    onSuccess: function() {
        alert('win');
    },
    onFailure: function() {
        alert('fail');
    }
}).post('name=This is a name&comment=This is a comment!');
}

这里我使用 .post 方法来发布数据。

于 2013-05-05T05:14:25.163 回答