Нет ошибки, но страница остается пустой с передаваемыми переменными

У меня есть небольшой тестовый проект, настроенный таким образом, что когда вы щелкаете по имени волка, он перенаправляет его на страницу, которую я хочу использовать для персонализации информации о том волке, на которого он нажал. Страница называется wolf.php. Я пытаюсь использовать переменную для передачи метода $_GET, чтобы назначить URL-адресу идентификатор волка, то есть www.testsite.com/wolf.php?id=1, но страница ничего не отображает, хотя я не получаю ошибку.

Вот домашняя страница (home.php)

<?php
$username = $_SESSION['username'];
$result = @mysql_query("SELECT * FROM wolves WHERE owner = '$username'");
while($wolf = mysql_fetch_array($result))
{
echo "<a href= wolf.php?id=$wolf[id]>$wolf[name]</a>";
};
?>

Щелкнув по этой ссылке, я попаду на сайт www.testsite.com/wolf.php?id=1 (или любой другой идентификатор). На wolf.php у меня есть это:

<?php
$id = $_GET['id'];
$result = @mysql_query("SELECT name FROM wolves WHERE id = '$id'") or die("Error: no  
such wolf exists");
echo .$result['name'].
;
?>

Я не уверен, где я ошибся, но, похоже, это не работает. Никакой информации об идентификаторе волка не появляется. Спасибо за помощь заранее.


person Sunden    schedule 22.07.2012    source источник
comment
Ваш код уязвим для инъекций SQL. Вам нужно использовать соответствующий метод вашей библиотеки базы данных, чтобы избежать ваших данных до выполнения запроса.   -  person Lix    schedule 23.07.2012


Ответы (4)


Включите отчеты об ошибках с error_reporting(E_ALL); ini_set('display_errors', 1); в разработке, чтобы вы видели фатальные синтаксические ошибки в своем коде. Также рекомендуется удалить @ оператор подавления ошибок из ваших mysql_*() вызовов.

У вас проблемы с синтаксисом в последней строке. Неожиданные операторы конкатенации .:

// Wrong:
// Parse error: syntax error, unexpected '.'
echo .$result['name'].
;

// Should be:
echo $result['name'];

Далее, вы не получили строку из своего запроса:

// mysql_query() won't error if there are no rows found.  Instead you have to check mysql_num_rows()
$result = mysql_query("SELECT name FROM wolves WHERE id = '$id'") or die("Query error: " . mysql_error());
// Zero rows found, echo error message.
if (mysql_num_rows($result) < 1) {
  echo "No such wolf.";
}
else {
  // Row found, fetch and display.
  $row = mysql_fetch_assoc($result);
  echo $row['name'];
}

Обратите внимание, что этот сценарий широко открыт для SQL-инъекций. Как минимум вызовите mysql_real_escape_string() для входных переменных вашего запроса.

$id = mysql_real_escape_string($_GET['id']);

В конечном счете, подумайте об использовании PDO или MySQLi вместо старых функций mysql_*(), поскольку они поддерживают подготовленные операторы для большей безопасности по сравнению с ручным экранированием переменных. Планируется, что функции mysql_*() устареют.

person Michael Berkowski    schedule 22.07.2012
comment
Я исправил проблему с синтаксисом, но все равно получаю пустую страницу. Спасибо за предупреждение о SQL-инъекциях, я посмотрю на это. - person Sunden; 23.07.2012
comment
@Sunden См. выше, вы не извлекли строку из набора результатов. - person Michael Berkowski; 23.07.2012

Во-первых, нужно получить строку результата.

Вариант 1 - ассоциативный массив (значения доступны как имена полей)

$result = mysql_fetch_assoc($result);
echo $result['name'];

Вариант 2 - нумерованный массив (по индексу, начиная с нуля)

$result = mysql_fetch_row($result);
echo $result[0];
person DTukans    schedule 22.07.2012

<?php
$username = $_SESSION['username'];
$result = @mysql_query("SELECT * FROM wolves WHERE owner = '$username'");

Вы забыли session_start(); в начале. $username - это "" и sql, возможно, возвращает 0 записей.

person Pablo Martinez    schedule 22.07.2012

Во втором фрагменте вы не можете обращаться с $result как с массивом; это идентификатор ресурса. Чтобы получить массив, выполните:

$row = mysql_fetch_assoc($result);
echo $row['name'];

Также читайте об уязвимости SQL-инъекций.

person lafor    schedule 22.07.2012