2013-05-27 2 views
-4

Я просмотрел google и несколько других сайтов, но я не могу понять, почему это не работает.PHP PDO Undefined Index

Я работаю на уни задания, и запустить следующий код:

$db = connect(); 
$testname = 'chunk'; 
try { 
     $stmt = $db->prepare('SELECT * FROM TreasureHunt.Player WHERE name = ?'); 
     $stmt->execute(array($testname)); 
     $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
     $stmt->closeCursor(); 
     } 
    catch (PDOException $e) { 
    print "Error checking login: " . $e->getMessage(); 
} 

$count = $stmt->rowCount(); 
echo 'Row count: ', $count, '<br>'; 
var_dump($result); 
echo '<br>Result: ', $result['name'], ' pw: ', $result["password"], '<br>'; 
print_r($result); 

Однако это приводит к следующему errorm:

Notice: Undefined index: name in /.automount/net/ufiler2/u2/cs3/dbes2376/lib/html/th/index.php on line 30 

Теперь я знаю, что это означает, что в моем $ result, имя индекса не должно существовать. Но это меня смущает, потому что она действительно существует, проверить, посмотрев в: var_dump ($ результат) var_dump ($ результат) дает мне:

array(1) { [0]=> array(5) { ["name"]=> string(5) "chunk" ["password"]=> string(7) "truffle" ["pw_salt"]=> string(8) "g#m#g#m#" ["gender"]=> string(1) "m" ["addr"]=> string(10) "Goon Docks" } } 

и print_r ($ результат) дает мне:

Array ([0] => Array ([name] => chunk [password] => truffle [pw_salt] => g#m#g#m# [gender] => m [addr] => Goon Docks)) 

Так почему я не могу ссылаться на них как на $ result ['name']? Или как я на самом деле ссылаюсь на него?

Спасибо. Извините, если это основной вопрос.

+0

Как видно из вывода var_dump ($ результат) '', это массив с другим массивом в нем. –

+0

Ничего себе, это много необъяснимых downvotes, особенно для вопроса, который на самом деле достаточно хорошо написан. Downvoters, любезно комментарий тоже? –

ответ

4

Вы должны использовать $result[0]['name'];

+0

Ах спасибо кучи – Max

+3

небольшое объяснение не повредит, если это поможет другим пользователям с той же проблемой .. – reikyoushin

+0

Согласен, я отправлю дополнительную информацию в будущем. –

2

fetchAll() возвращает массив массивов. Так что в вашем случае доступа

$result[0]['name'] 

вместо

$result['name'] 

Другим вариантом было бы использовать только fetch() для того, чтобы получить только одну строку результата каждый раз.

+0

Ahh .. так что это многомерный массив. Спасибо. – Max

0

У вас есть несколько ошибок в коде. Я переписал его, мы надеемся удалить их, и получить его работу, как и ожидалось:

$db = connect(); 
$testname = 'chunk'; 

try { 
    $stmt = $db->prepare('SELECT * FROM TreasureHunt.Player WHERE name = ?'); 
    $stmt->execute(array($testname)); 

    foreach($stmt->fetchAll(PDO::FETCH_ASSOC) as $row){ 
     echo 'Result: ' . $result['name'] . ' pw: ' . $result['password'] . '<br />'; 
    } 
} catch (PDOException $e) { 
    print "Error checking login: " . $e->getMessage(); 
} 

$count = $stmt->rowCount(); 
echo 'Row count: ' . $count . '<br>'; 
+0

-1 для использования исключения для печати ошибки ... и все еще осталось много ошибок –

+0

@YourCommonSense Я только добавил ошибку исключения, потому что это было в примере исходного кода. Не на самом деле причина для downvoting. –

+0

@YourCommonSense ах, только что видел ошибки с последним эхом, исправил их, спасибо –

0

У вас есть несколько ошибок в коде. Я переписал его, чтобы надежно удалить их, и заставить его работать, как ожидалось. Вы должны также подключить, как описано в tag wiki

$db = connect(); 
$testname = 'chunk'; 
$stmt = $db->prepare('SELECT * FROM TreasureHunt.Player WHERE name = ?'); 
$stmt->execute(array($testname)); 
$row = $stmt->fetch(); 

$count = $stmt->rowCount(); 
echo 'Row count: ', $count, '<br>'; 
echo '<br>Result: ', $row['name'], ' pw: ', $row["password"], '<br>';