2013-04-06 2 views
1

В настоящее время я создаю свое первое приложение PHP. Я хочу читать в автобусе время из файла csv и отсылать обратно пользователей следующего автобуса из своей резиденции в наш университет. Это моя первая попытка с PHP, так нежна:Неопределенное смещение: 0 в первом приложении 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; 
    } 
} 

другие функции, которые она использует не релевантны, я думаю. Теперь я не могу показаться, чтобы найти, почему это продолжает производить:

Примечание: Undefined смещение: 0 в /Applications/MAMP/htdocs/html/shuttle.php на линии 16

Примечание: Undefined смещение: 0 в/Applications /MAMP/htdocs/html/shuttle.php на линии 22

соответствующие линии

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

и

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

Поблагодарили бы за помощь! :)

Edit:

я передал тот же файл в моей системе Linux и без каких-либо изменений, которые я получаю vardump. Если я использую тот же vardump на MAMP на моем Mac, массив пуст. Теперь я получаю за:

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. Почему большой int 9573? Значение в таблице равно 2.
+0

В таких ситуациях * отлаживайте * свои результаты, например, используя это: 'echo '

'; var_dump($some_variable); echo '
';' – thaJeztah

+0

Получает ли ваш запрос() результаты или создает только запрос к БД ??? запрос и получить результаты - это разные действия !!! – Svetoslav

+0

Возможный дубликат [PHP: «Примечание: неопределенная переменная» и «Примечание: неопределенный индекс»] (http://stackoverflow.com/questions/4261133/php-notice-undefined-variable-and-notice-undefined-index) –

ответ

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"); 
    } 

Кроме того, что только "исправления" его. Если вы хотите идти в корень проблемы, то в функции запроса(), который вызывается в $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. */ 
} 

Из documentation, fetchall возвращает пустой массив, если нет ничего, так что функция может возвращать пустой массив.

+0

Спасибо за ваш ответ, кстати. Я обновился выше – user2252633

+0

Добро пожаловать, хотя есть еще несколько вещей, которые я бы изменил с кода. –

1
$users = query("SELECT * FROM users WHERE id = ?", $_SESSION["id"]); 
if ($users === false) { } 

Вы строго проверяете, возвращался ли запрос false, что происходит только тогда, когда что-то не так с запросом или параметрами. Это не проверяет, был ли возвращен какой-либо результат, и вы ссылаетесь на первую возвращенную запись ($users[0]["residence"]), которой нет ($users - пустой массив).

Поскольку идентификатор пользователя поступает из $_SESSION["id"], он должен быть доступен и доступен в базе данных, но есть вероятность, что где-то в коде вы переписываете его другим идентификатором.

+0

Да, но он работал раньше с тем же самым запросом. Я использую тот же код в своей Linux-системе. луч заполняется. Я обновил выше, поэтому, пожалуйста, смотрите :) – user2252633

+0

Проверьте, какой идентификатор передан вашему запросу и ваше соединение db, если оно подключается к требуемому хосту/базе данных. Также разрешайте отчеты об ошибках и журналы просмотра для любых предупреждений/уведомлений. –

Смежные вопросы