MySQL: показывать содержимое в постоянных ссылках по идентификатору строки
Я пытаюсь создать свою собственную CMS, и я довольно новичок в php и mysql. Позвольте мне перейти к делу:
До сих пор я создавал новости на странице индекса с постоянными ссылками "подробнее" (что означает, что когда я нажимаю "подробнее", это перемещает меня на другую страницу, например, /readmore.php?id=[news ID]
, и на этой странице единственное содержимое - это конкретные новости, т.е. определенная строка из таблицы. То, с чем я застрял, - это получение определенного идентификатора строки в этой постоянной ссылке.
Позвольте мне показать код, который в настоящее время работает для меня.
Индекс файл с новостями:
while($row = mysql_fetch_array($result))
{
/*... title, news content... */
echo "<a href='readmore.php?id=".$row['ID']."'>".$read_more_link."</a></div>";
}
Readmore.php с точной строкой (например, readmore.php?id=1201):
$params = $_SERVER['QUERY_STRING'];
$str = $params;
$id1 = $str[strlen($str)-1];
$id2 = $str[strlen($str)-2];
$id3 = $str[strlen($str)-3];
$id4 = $str[strlen($str)-4];
$news_id = "$id4$id3$id2$id1";
$query = "SELECT * FROM naujiena WHERE ID='$news_id'";
В основном, что он делает, он восстанавливает 4 последние цифры из адресной строки и ищет эти новости с этим 4-значным идентификатором
Это очень примитивный способ сделать это, но я застрял с этим на несколько дней и не могу найти выход.
Что я пробовал раньше, так это создать переменную с сеансом в цикле while($row = mysql_fetch_array($result))
, она показывает идентификаторы на странице индекса, как и должно быть, но в прочитайте больше страницы только последнюю или первую (зависит от desc или asc), что было совершенно очевидно ожидать
Вы можете мне помочь? Я был бы признателен за это.
4 answers
Вы можете получить доступ к значениям в строке запроса по имени в массиве $_GET
.
Например, $_GET['id']
будет значением части id=<ID>
строки запроса. Это работает для каждого поля строки запроса.
// url : readmore.php?id=1201
$news_id = intval($_GET['id']);
// now, $news_id contains the value 1201
$query = "SELECT * FROM naujiena WHERE ID='$news_id'";
Вы можете прочитать официальную справку : $_GET
или один из различных учебников, которые вы можете найти в Интернете: http://www.w3schools.com/php/php_get.asp
Обновление
Поскольку вы приняли мой ответ, я чувствую себя обязанным также бросьте пару слов о SQL-инъекции. Вы всегда должны очищать любые входные данные, которые вы используете в SQL-запросе, с помощью mysql_real_escape_string
. Вы можете найти более подробную информацию в Википедии: SQL-инъекция или в документации PHP: SQL-инъекция.
Поскольку ваши идентификаторы являются числовыми значениями, вы также можете убедиться в этом. Я обновил фрагмент кода, чтобы сделать это с помощью intval
.
Чтобы извлечь параметры строки запроса в php, используйте $_GET
суперглобальный, например:
$_GET["id"]
Также обратите внимание, что любые данные, предоставленные удаленным пользователем (пользователем, браузером и т.д.), могут быть подделаны.
Таким образом, злоумышленник может также отправить вам ?id=0; DROP TABLE users
или что-то подобное.
Подробнее о SQL-инъекциях.
Всегда полезно проверить входные данные.
Вы ожидаете, что идентификатор будет целым числом, поэтому в целях безопасности вы можете проверить if(ctype_digit($_GET["id"]))) ...
И наконец, также рекомендуется очистить любые входные данные, которые вы используете в инструкциях SQL. Использовать mysql_real_escape_string()
, или рассмотрите возможность использования PDO
Чтобы получить определенную переменную HTTP-GET, вы можете использовать $_GET["variableName"]
. В вашем случае вы могли бы получить идентификатор следующим образом:
$news_id = $_GET["id"];
Используйте pdo, он уже включает в себя предустановку sql-инъекции