1

我目前正在构建我的第一个 PHP 应用程序。我想从 csv 文件中读取公交车时间,并将下一班从他们住所到我们大学的公交车还给 ti 用户。这是我第一次尝试 PHP,所以要温柔:

<?php

    // configuration
    require("../includes/config.php"); 


    if (!empty($_SESSION["id"]))
    {
        //lookup database entries for house
        $users = query("SELECT * FROM users WHERE id = ?", $_SESSION["id"]);
        if ($users === false)
        {
            apologize("Sorry, there was an error");
        }
        //lookup database entries for house
        $residences = query("SELECT * FROM residences WHERE id = ?", $users[0]["residence"]);
        if ($residences === false)
        {
            apologize("Sorry, there was an error");
        }
        //if user specified a residence in his profile
        if($residences[0]["id"] != 0)
        {   
            $times = array();           
            //if there is no bus today, in this case sat and sun
            if(date( "w", $timestamp) == 0 || date( "w", $timestamp) == 6)
            {
                $times[0] = "There is no bus today";
            }
            //load the busplan for his residence
            else
            {
                //open file and load in array if time is higher than date("His");
                $timesList = file_get_contents($users[0]["residence"] . ".csv");
                $nextbuses = explode(',', $timesList);
                $hoursMins = date("Gi");

                $num = 0;

                for($i = 0; $i < count($nextbuses); $i++)
                {
                    if($hoursMins < $nextbuses[$i])
                    {
                        $times[$num] = $nextbuses[$i];
                        $num++;
                    }

                }
            }
            render("shuttle_show.php", ["title" => "Next Shuttle from your residence.", "times" => $times]);
        }
    }

这使用函数查询:

function query(/* $sql [, ... ] */)
{
    // SQL statement
    $sql = func_get_arg(0);

    // parameters, if any
    $parameters = array_slice(func_get_args(), 1);

    // try to connect to database
    static $handle;
    if (!isset($handle))
    {
        try
        {
            // connect to database
            $handle = new PDO("mysql:dbname=" . DATABASE . ";host=" . SERVER, USERNAME, PASSWORD);

            // ensure that PDO::prepare returns false when passed invalid SQL
            $handle->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
        }
        catch (Exception $e)
        {
            // trigger (big, orange) error
            trigger_error($e->getMessage(), E_USER_ERROR);
            exit;
        }
    }

    // prepare SQL statement
    $statement = $handle->prepare($sql);
    if ($statement === false)
    {
        // trigger (big, orange) error
        trigger_error($handle->errorInfo()[2], E_USER_ERROR);
        exit;
    }

    // execute SQL statement
    $results = $statement->execute($parameters);

    // return result set's rows, if any
    if ($results !== false)
    {
        return $statement->fetchAll(PDO::FETCH_ASSOC);
    }
    else
    {
        return false;
    }
}

我猜它使用的其他功能不相关。现在我似乎无法找到为什么这会继续产生:

注意:未定义的偏移量:第 16 行 /Applications/MAMP/htdocs/html/shuttle.php 中的 0

注意:未定义的偏移量:第 22 行 /Applications/MAMP/htdocs/html/shuttle.php 中的 0

相关线路是

    $residences = query("SELECT * FROM residences WHERE id = ?", $users[0]["residence"]);

    if($residences[0]["id"] != 0)

将不胜感激一些帮助!:)

编辑:

我将相同的文件传输到我的 linux 系统,并且没有任何更改,我得到了一个 vardump。如果我在 Mac 上的 MAMP 上使用相同的 vardump,则数组为空。现在我得到:

var_dump($users);

array (size=1)
  0 => 
    array (size=5)
  'id' => int 12
  'username' => string 'frechdaxx' (length=9)
  'mail' => string '*************@gmail.com' (length=23)
  'hash' => string '$1$qr5axj4C$BET5zZGJza2DcHI8eD8fV0' (length=34)
  'residence' => int 9573
  1. 为什么这是一个问题?在我访问用户表之前,函数查询使用完全相同的语法,我们可以看到它正确地返回了所有其他值。

  2. 为什么我的环境之间存在差异?该阵列在我的 MAMP 服务器上是空的,但可以在 Linux 上运行。但是,其他带有查询功能的代码示例在这两种环境下都能完美运行

  3. 为什么 9573 的大整数?表中的值为 2。
4

2 回答 2

2

这简直就是$users[0]["residence"]不存在(未设置)。在尝试使用它之前,您应该检查它。如您所见,这只是一个通知,而不是错误。这意味着在某些情况下,可以取消设置变量并且 PHP 不会抱怨太多,但这绝对不是一般规则。

我会将其更改为:

  $users = query("SELECT * FROM users WHERE id = ?", $_SESSION["id"]);
  if (empty($users[0]["residence"]))
    {
    apologize("Sorry, there was an error");
    }

此外,这只会“修复”它。如果你想找到问题的根源,它在被调用的 query() 函数中$users = query("SELECT * FROM users WHERE id = ?", $_SESSION["id"]);

  // execute SQL statement
  $results = $statement->execute($parameters);

  // return result set's rows, if any
  if ($results !== false)
  {
    $fetched = $statement->fetchAll(PDO::FETCH_ASSOC);
    // Check that ther was actually something fetched
    if(!empty($fetched))
    {
      return $fetched;
    }
  }
/* You don't need to return false, null is the default returned value.
 * If you *want* it, then delete the else. */
}

文档中,如果没有任何内容, fetchall 返回一个空数组,因此该函数可能会返回一个空数组。

于 2013-04-06T20:04:38.623 回答
1
$users = query("SELECT * FROM users WHERE id = ?", $_SESSION["id"]);
if ($users === false) {   }

您正在严格检查查询是否返回错误,这仅在查询或参数有问题时发生。这不会检查是否返回了任何结果,并且您指的$users[0]["residence"]是不存在的第一个返回记录()($users是一个空数组)。

由于用户 id 来自$_SESSION["id"]它应该存在并在数据库中可用,但有可能在您的代码中的某处您正在用其他 id 覆盖它。

于 2013-04-06T20:17:07.157 回答