【问题标题】:What's wrong with this database call?这个数据库调用有什么问题?
【发布时间】:2012-07-26 16:41:18
【问题描述】:

-问题仍未解决-

我正在尝试调用数据库,将表的所有行放入一个数组中,将该表作为 json 数据传递给我的 JS,然后将该数据用作函数的参数。

当我运行脚本时,什么也没有发生。我在控制台中没有任何错误,脚本的其余部分正常加载。我对 mySQL 和 PHP 很陌生,我在这里做错了什么?我怀疑我搞砸了 php。

  • XAMPP 服务器,正在我的桌面上测试
  • 所有链接的文件都在同一个目录中
  • 任何地方都没有显示可见的错误。据我所知,该脚本甚至没有尝试加载 PHP,但也没有在 firebug 的控制台中显示错误

已尝试

  • 重命名不带空格的表
  • 将 for 循环放在回调函数中
  • 修正 php 错误

这是我正在使用的更新后的 JS:

    this.taskMenu = function()
    {
        var table = [];
        $.getJSON("taskMaster.php", {"table" : "firstlist"},
            function(data)
            {
                table.push(data);

                for(i=0; i<table.length; i++)
                {
                    var taskId = table[i].taskName.replace(/\s+/g,"") + i;
                    formatTask("interface",taskId,table[i].taskName,table[i].taskDescription,table[i].taskComplete);
                }

            });
     }

这是更新后的 PHP:

error_reporting(E_ALL); ini_set('display_errors','On');
$con = mysql_connect("localhost", "root", "m3648y73");
if (!$con){die('Could not connect: ' . mysql_error());};
mysql_select_db("tasklistdb", $con);

$table = $_GET['table'];

$sql = mysql_query("SELECT taskName, taskId, taskDescription, taskComplete FROM `".$table."`");
$listTasks = array();

while ($row_user = mysql_fetch_assoc($sql))
    $listTasks[] = $row_user;

echo json_encode($listTasks);

mysql_close($con);

我是否正确链接到数据库?

【问题讨论】:

  • 在浏览器中打开 taskMaster.php 时看到了什么?
  • 打开报告并将错误添加到 php 页面的顶部。错误报告(E_ALL); ini_set('display_errors','On');确保使用正确的参数调用此页面。
  • 我只是想补充一点,在您解决了这个问题之后,您应该阅读有关 SQL 注入的信息。你现在非常脆弱。另外,尝试使用 PDO 代替 mysql_connect,这是推荐的方式。
  • @Vatev 我希望我能想到这一点。什么都没有,taskMaster.php 什么也没显示,所以我认为我的数据库调用不正确?
  • 如果将 $_GET['table'] 更改为 $_POST['table'] 会发生什么?我认为首先需要发布而不是获取。

标签: php jquery mysql json


【解决方案1】:

getJSON 是异步调用。所以在它可以从 PHP 中获取值并执行回调函数之前,它会移动到 for 循环,这里的表是空的。

解决方案:在回调函数中移动你的 for 循环

【讨论】:

  • 我这样做了,它没有改变任何东西
  • 您可以在 Firefox 浏览器中使用 firebug 并告诉我们您从服务器得到的响应是什么?
  • 我不知道在哪里可以找到这个,但是浏览了 firebug 中的每个面板,我没有看到我的数据库被引用
  • 在 Net 面板下,如果启用,您将看到对您的页面 (taskMaster.php) 的调用。当您单击该网址时,您将看到不同的选项卡。
  • 我没有在网络面板下得到任何东西;我必须连接firephp吗?
【解决方案2】:

您在 php 文件中的 $listTasks = array() 行缺少一个分号

【讨论】:

    【解决方案3】:

    发生这种情况是因为在请求本身之前执行的异步请求之后的 js-code 已经结束。试试这个:

    this.taskMenu = function()
    {
        var table = [];
        $.getJSON("taskMaster.php", {table : "first list"},
            function(data)
            {
                table.push(data);
                for(i=0; i<table.length; i++)
                {
                    var taskId = table[i].taskName.replace(/\s+/g,"") + i;
                    formatTask("interface",taskId,table[i].taskName,table[i].taskDescription,table[i].taskComplete);
                 }
            });
    }
    

    【讨论】:

    • 您在逻辑上是正确的,但如果它是由浏览器从缓存中获取的,那么这可能不会一直发生。
    • 但是在回调中使用更多的动作仍然比希望缓存更好。
    • 我按照您的说明对其进行了编辑,但我仍然遇到同样的问题。从现在开始,我将把它留在回调中(我理解它的逻辑)
    【解决方案4】:

    您的表名不能是“第一个列表”

    MySQL 表名中不能有空格。

    您还应该将表放在 JSON 值中的双引号中,例如 {"table":"table_name"}

    【讨论】:

    • 是的,如果您记得正确引用提问者 的表标识符(带有反引号),您可以在表名中包含空格做。
    • 这确定吗?我用谷歌搜索了那个具体的东西,我得到的答案另有说明。如果我真的不能,那可能就是问题所在
    • @ctrahey 是正确的。您必须始终在反引号中引用它。尽管以这种方式命名表,但这通常是不好的做法。
    • 我需要能够在代码的另一部分使用表名作为可见字符串。我可以使用具有正确表名列(没有空格或特殊字符)和要显示的字符串列的表来实现吗?无论哪种方式,我都需要解决手头的问题,但我会牢记这一点
    • 我重命名了表只是为了确保,但它仍然无法正常工作
    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多