【问题标题】:PHP Script does not seem to workPHP 脚本似乎不起作用
【发布时间】:2017-03-30 17:23:41
【问题描述】:

我在我的网站空间上运行了一个用于安卓应用程序的脚本。虽然,它似乎不起作用。在某些网站空间上,当我尝试访问它时会得到一个空白站点,而在其他网站上,我会收到 500 内部服务器错误。虽然这个脚本应该可以正常工作,因为它曾经这样做过。

它应该从一个表中获取所有信息并在一些 INNER JOIN 之后回显它。即使在进行了一些 mysqli_error 检查和一些回显检查变量等之后,我也无法跟踪错误。

变量 $con 确实存在,连接应该可以正常工作。我只是因为堆栈溢出删除了它^^。

 <?php


$subId = 1;


$sql = "SELECT articles.a_id, sciences.science, articles.title, articles.content, login.username, articles.date, articles.viewed, articles.timestamp FROM articles 
                INNER JOIN sciences ON articles.s_id = sciences.s_id 
                INNER JOIN login ON articles.author = login.id
                WHERE articles.s_id = ".$subId."
                ORDER BY timestamp DESC";

if (!$res = mysqli_query($con,$sql)) {
    echo "FAIL";
    echo mysqli_error($con);
}
else {

$result = array();

while($row = mysqli_fetch_array($res)){
array_push($result,
array('a_id'=>$row[0],
'science'=>$row[1],
'title'=>$row[2],
'content'=>$row[3],
'author'=>$row[4],
'date'=>$row[5],
'viewed'=>$row[6],
'timestamp'=>$row[7]
));
}

echo json_encode(array("result"=>$result));
}
mysqli_close($con);


?>

编辑:我更新了我的代码:

    <?php


$subId = 1;

$con = mysqli_connect("HOST", "USER", "PASSWORD", "DATABASE");

if (!$con)
{
echo "Cant't connect to MySQL.<br>";
echo "Debug: " . mysqli_connect_errno()
}


$sql = "SELECT articles.a_id, sciences.science, articles.title, articles.content, login.username, articles.date, articles.viewed, articles.timestamp FROM articles 
INNER JOIN sciences ON articles.s_id = sciences.s_id 
INNER JOIN login ON articles.author = login.id
WHERE articles.s_id = ".$subId."
ORDER BY timestamp DESC";

if (!$res = $con->query($sql))
{
    echo "FAIL";
}
else
{

    $result = array();

    while($row = $con->fetchArray($res))
    {
        array_push($result); //use the query to rename fields, if needed
    }

    echo json_encode(array("result"=>$result));
}



?>

【问题讨论】:

  • 为什么不直接获取关联数组而不是编号数组并进行转换?如果您需要重命名列,您甚至可以在 select 语句中执行此操作。
  • 您检查过错误日志吗?他们可以提供一些有用/重要的信息。这将是我要检查的地方,尤其是在大多数情况下您没有收到错误的情况下。还有你的环境vps、共享主机等是什么?
  • 您的代码容易受到 SQL 注入攻击。您应该使用mysqliPDO 准备好的语句,如this post 中所述。
  • 从技术上讲,这不是 alex,因为他没有将任何外部数据放入查询中。 $subid 似乎总是被定义为 1。另外,他正在使用 mysqli...
  • 如果 $subId 来自实际代码中的外部源,这可能是 500 错误的原因。要回答这个问题,需要更多背景信息。

标签: php mysql sql arrays


【解决方案1】:

我认为部分问题在于您混淆了 mysql 和 mysqli 函数。您在程序上使用 mysqli,即:mysqli_fetch_array(),它不存在。你必须转换成 mysql,或者像这样使用 mysqli 函数:

$subId = 1;

$con = mysqli_connect('host', 'user', 'pass', 'dbname');

if (!$con)
{
echo "Cant't connect to MySQL.<br>";
echo "Debug: " . mysqli_connect_errno()
}


$sql = "SELECT articles.a_id, sciences.science, articles.title, articles.content, login.username, articles.date, articles.viewed, articles.timestamp FROM articles 
INNER JOIN sciences ON articles.s_id = sciences.s_id 
INNER JOIN login ON articles.author = login.id
WHERE articles.s_id = ".$subId."
ORDER BY timestamp DESC";

if (!$res = $con->query($sql))
{
    echo "FAIL";
}
else
{

    $result = array();

    while($row = $con->fetchArray($res))
    {
        array_push($result); //use the query to rename fields, if needed
    }

    echo json_encode(array("result"=>$result));
}

【讨论】:

  • @ProgFroz,发布您修改后的代码,以便我们可以看到您做了什么。此外,包含 $con 变量,但将连接信息更改为 foo,以便我们可以在上下文中看到该行。这听起来像是语法错误,所以答案可能就在某处。
  • 很抱歉,我自己也遇到了一些语法错误。试试这个:在调试行的末尾添加一个分号,并用while($row = $res-&gt;fetch_array())替换while循环我在我的本地主机上做了这个,它工作了。
  • 想想看,你甚至不应该需要 while 循环。如果您在查询中重命名字段,则只需 echo json_encode(array("result"=&gt;$res-&gt;fetch_array()));
  • 现在我得到了 java.lang.String 类型的 Value SONObject,脚本以某种方式回显了我没想到的东西。
  • 当我在站点时,我得到了正确的 json 数组,但它有效。谢谢你。
【解决方案2】:

将时间戳更改为timestamp,因为它是保留字添加反引号

【讨论】:

    【解决方案3】:

    尝试使用 PHP 中的错误报告。通过在代码开头添加以下行来启用错误报告。

    ini_set('display_startup_errors', 1);
    ini_set('display_errors', 1);
    error_reporting(-1);
    

    【讨论】:

    • 这是个坏主意,因为它正在为 Android 应用程序提供动力,并且该信息只应在开发/测试环境中显示,而不应在生产环境中显示
    • 这仍然可以在登台时用于调试目的。毕竟不是一个坏主意。
    【解决方案4】:

    你忘了

    $con = mysqli_connect("localhost","my_user","my_password","my_db");

    在脚本的开头。

    【讨论】:

    • 第三段The variable $con does exist, the connection should work properly. I just removed it for stack overflow ^^.
    • op 说他的连接字符串工作正常,他只是从堆栈溢出代码中删除了它
    猜你喜欢
    • 1970-01-01
    • 2017-05-29
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    相关资源
    最近更新 更多