переменные php-запроса, присваивающие $ _GEt - PullRequest
0 голосов
/ 22 апреля 2010

если вы посмотрите на предыдущий вопрос

мод перезаписи, заголовки слагов и htaccess

Я использую решение, предложенное полковником Шрапнелем, но когда я присваиваю значения $ _GET в реальном файле, а не из запроса, код не работает. По умолчанию он удаляется из файла, как будто переменные $ _GET не установлены

Код, который я придумал, -

if(!empty($_GET['cat'])){

    $_GET['target'] = "category";


    if(isset($_GET['page'])){

        $_GET['pageID'] = $_GET['page'];

    }

    $URL_query = "SELECT category_id FROM cats WHERE slug = '".$_GET['cat']."';";
    $URL_result = mysql_query($URL_query);
    $URL_array = mysql_fetch_array($URL_result);

    $_GET['category_id'] = $URL_array['category_id'];



}elseif($_GET['product']){

    $_GET['target'] = "product";


    $URL_query = "SELECT product_id FROM products WHERE slug = '".$_GET['product']."';";
    $URL_result = mysql_query($URL_query);

    $URL_array = mysql_fetch_array($URL_result);
    print_r($URL_array);

    $_GET['product_id'] = $URL_array['product_id']; 

Исходная переменная строка, которую я пытаюсь представить, является

/cart.php?Target=product&product_id=16142&category_id=249

И я пытаюсь создать переменные строки запроса с кодом, включая cart.php, чтобы я мог использовать более чистые URL

Итак, у меня есть product / product-title-with-clean-url / идущий на slug.php? Product = slug

Затем слаг ищет в БД запись с соответствующим слагом и возвращает product_id, как в приведенном выше коде. Затем строится строка запроса и включается cart.php

Ответы [ 2 ]

2 голосов
/ 22 апреля 2010

Многое не так с этим кодом.

1 Я считаю плохой формой устанавливать такие переменные GET

2 Похоже, что на самом деле используется только около 6 строк вашего кода.

$_GET['target'] = "category";

Не используется вместе с кучей других вещей.

3 Вы просите ввести SQL здесь:

$URL_query = "SELECT category_id FROM cats WHERE slug = '".$_GET['cat']."';";

если $ _GET ['cat'] равно

'';delete * from cats

тогда ваш запрос

SELECT category_id FROM cats WHERE slug = '';delete * from cats;

И все твои кошки исчезли

используйте mysql_real_escape_string () , если необходимо использовать функции mysql_

Что касается вашей актуальной проблемы. Что не работает? вы получаете ошибку? Нам нужно больше информации

1 голос
/ 22 апреля 2010

Хорошо, ваш код никогда не будет работать.С учетом вашего запроса

/cart.php?Target=product&product_id=16142&category_id=249

ваш $ _GET будет заполнен следующим образом:

$_GET = array(
    'Target' => 'product',
    'product_id' => 16142,
    'category_id' => 249
)

Затем вы будете использовать следующую структуру:

if(!empty($_GET['cat'])){
   ... stuff part 1...
}elseif($_GET['product']){
   ... stuff part 2...
  1. В вашем запросе нет параметра 'cat' (и, следовательно, также не будет в $ _GET), поэтому empty () возвращает true, отрицается, и, следовательно, "stuff part 1" никогда не выполняется.
  2. Тамне является параметром 'product' в вашем запросе (и, следовательно, также не будет в $ _GET), поэтому elseif имеет значение false и поэтому также не выполняет раздел 'stuff part 2'.

Что касается вашего комментария о перезаписи переменных $ _GET, вы просто присваиваете ему новое значение.Но это неправильный путь.$ _GET (и его двоюродные братья $ _POST и $ _REQUEST) никогда не должны быть перезаписаны.Они ДОЛЖНЫ рассматриваться как массивы только для чтения.

В вашем приложении это может быть нормально, но учтите, что GET / POST / REQUEST - не единственные места, где можно получить данные.Возможно, какой-то модуль / библиотека, которую вы используете, имеет доступ HTTP_QUERY_VARS (что устарело) или $_SERVER['QUERY_STRING'] или _$SERVER['REQUEST_URI'].Все они в основном содержат одинаковую информацию, но хранятся отдельно внутри PHP.Если вы измените $ _GET, а затем библиотека извлечет свои собственные копии переменных запроса из одного из альтернативных местоположений, она получит нечто совершенно отличное от значения, которое вы только что переписали, потому что вы перезаписали его только в одном месте.Помните, что эти волшебные массивы создаются PHP до того, как ваш код будет выполнен, и затем внутренняя часть PHP никогда больше не затрагивает их.Попробуйте следующее:

testscript.php? Yo = dude:

<?
echo '<pre>';

echo "Before:\n";
echo "GET yo: ", $_GET['yo'], "\n";
echo "REQUEST yo: ", $_REQUEST['yo'], "\n";

$_GET['yo'] = "haha, it's not the same anymore";

echo "after:\n";
echo "GET yo: ", $_GET['yo'], "\n";
echo "REQUEST yo: ", $_REQUEST['yo'], "\n";

поместите его в скрипт, запустите его в браузере.Вот что вы получите:

Before:
GET yo: dude
REQUEST yo: dude
after:
GET yo: haha, it's not the same anymore
REQUEST yo: dude

Обратите внимание, что _REQUEST не обновлялся автоматически с вашим новым значением.Теперь у вас есть противоречивые данные, и это может полностью сломать ваше приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...