从返回的mysqli查询结果

时间:2017-01-05 09:25:04

标签: javascript php mysql arrays mysqli

我最近遇到了一个问题。几个月前我开发了这个代码并且它正在工作,现在我尝试再次运行代码,它根本就不起作用。我会解释

我有一个javascript文件,它将数据查询到一个php文件,该文件应该以INNER JOIN的形式查询来自3个表,A,B和C的数据。就像我之前说的那样工作,现在它只是返回并错误到我的javascript,因为它返回并清空数组,它给了我javascript上的JSON.parse错误。

好的继续,每当我推送从表A和B获得的数据时,php返回一个完整的数组,但如果我从表C推送结果,我的php返回并清空数组。我已经尝试运行我的sql来检查它是否错误,我的sql在我的控制台上查询正常。它是如此令人沮丧,因为我看到结果在控制台上返回3表,但如果我尝试从我的php文件中获取它们,如果它包含表A和B中的数据,它将返回一个数组,但是很快因为我包含表C的结果,它只返回空。

以前发生在我身上但我根本无法找到并回答为什么会发生这种情况,因为在某些文件中,当我查询多个表最多5个表时,它确实有效,但在某些文件上它根本无法工作。

这是我的php代码:

<?php
if(!isset($_POST['Select']))
die("You Do Not Have Permission To Access This File");

require_once 'DB_Connect.php';
$db = new DB_Connect();
$conn = $db->connect();


$sql = "SELECT AssignedStudent.Student_ID, Programs.name, Student.name As StName, Student.email FROM AssignedStudent INNER JOIN Programs ON AssignedStudent.Programs_ID = Programs.ID INNER JOIN Student ON AssignedStudent.Student_ID = Student.ID WHERE AssignedStudent.status='Active' ORDER BY Programs.name, AssignedStudent.Student_ID ASC";
$resultsAssigned = mysqli_query($conn, $sql);

$data = array();
$data2 = array();
if(mysqli_num_rows($resultsAssigned)>0){

    while($row = mysqli_fetch_assoc($resultsAssigned)) {

        $StProgam = $row["name"];
        $StID = $row["Student_ID"];
        //$StName = $row["StName"];
        //$StEmail = $row["email"];
        $StName = "das";
        $StEmail = "das";

        //echo $StName."-".$StEmail."\n";
        array_push($data, array("ProgramName"=>$StProgam,"StudentID" => $StID, "StudentName" => $StName, "StudentEmail" => $StEmail));
        //$data[] = array("ProgramName"=>$StProgam,"StudentID" => $StID, "StudentName" => $StName, "StudentEmail" => $StEmail);

    }   
}
echo json_encode($data);
?>

要关闭,如果有人正在阅读这篇文章,请关注While循环中的内容,因为其他一切都在100%工作,我已经测试过了。在while循环中,我有一些代码注释,它们演示了我正在谈论的错误。如果我取消注释这两行:     // $ StName = $ row [&#34; StName&#34;];     // $ StEmail = $ row [&#34; email&#34;]; 我的PHP将返回一个空的结果到我的JavaScript,但这两行工作正常:     $ StName =&#34; das&#34 ;;     $ StEmail =&#34; das&#34;;。正如我之前提到的,我从3个单独的表中访问数据,并且一旦我包含来自表C的数据,这是我刚才提到的变量,我的php根本不会返回任何值但是只要我省略它们,它就有效很好。

只有那两行产生错误,这基本上是荒谬的,因为我从我的查询中获得了完整的结果,在我的控制台上得到证明,但是只要我从row []结果访问它们并将其推入数据数组,它返回一个空数组。

此外,当我从行[]获取结果时,我尝试回显结果,并且它确实返回结果,但是一旦我将它们推入数组,它就会停止工作。为了解释它,我推$ StName =&#34; das&#34 ;; $ StEmail =&#34; das&#34 ;;进入我的数组它工作正常,但如果我推$ StName = $ row [&#34; StName&#34;]; $ StEmail = $ row [&#34; email&#34;];它不会工作,但如果我在这些变量中回显结果,它们确实会显示出来。

问题是当$ row [&#34; StName&#34;]中的结果时,我无法进入我的数组;和$ row [&#34; email&#34;];

以下是我的控制台查询的屏幕截图: MYSQL QUERY RESULTS FROM CONSOLE

最后,我使用xampp在我的localhost上运行代码,我已经卸载了3年前的xampp并更新到最新版本并仍然有相同的错误。它太令人沮丧了。我知道它可能听起来不合适但是我的笔记本电脑可能是硬件问题吗?

P.S。在我的在线服务器上使用相同数据库的相同代码完全可以100%完成,但在我的机器本地主机上,它会为我提供空数组。

2 个答案:

答案 0 :(得分:1)

您说它适用于一台服务器,但不适用于本地服务器。两者之间有所不同,可能在PHP配置中,也许在MySQL设置中。但这可能很难诊断,除非你知道它在何时工作和现在之间做了哪些改变。

更简单的方法可能是对PHP脚本进行一些简单的调试。

尝试直接从浏览器调用php文件(您必须注释掉安全检查),并添加一些调试回显语句。

我的建议是在while循环中添加一个调试行,并使用print_r回显$ row变量:

echo "<p>row:<pre>".print_r($row,true)."</pre></p>\n";

然后,在while循环结束时,回显$ data数组:

echo "<p>data:<pre>".print_r($data,true)."</pre></p>\n";

在SQL语句中,您将别名为一个字段(StName),而不是电子邮件字段。查看上面第一个回声返回的内容将确认查询返回的字段名称。查看第二个回波的结果可能会发现您期望的结构存在一些差异。在测试期间,您可能希望向SQL语句添加limit 0,4语句,以将结果限制为可管理的输出大小。

答案 1 :(得分:0)

经过一番挖掘,我发现我的php的问题是从数据库返回的一些记录包含json_encode不支持的一些字符,所以我做的是在建立连接到j之后添加以下行服务器:

mysqli_set_charset($conn, "utf8");

问题解决后,它返回了我的所有记录。