2010-04-22 5 views
0

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

mod rewrite, title slugs and htaccess

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

Код я пришел с IS-

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-адрес

Итак, у меня есть продукт/товар-название-с-чистым URL-адресом/slug.php? продукт = пробковый

Затем пробкового ищет дб для записи с согласующим слизнем и возвращает product_id, как в коде above.Then построил строку запроса и включает в себя cart.php

+0

Какой код .htaccess вы используете для маршрутизации пули? –

+0

Я еще не получил то еще ... все еще тестирую переменные $ _GET на slug.php. im stumped with this – chris

+0

Где задание GET? Я не вижу его во включенном коде. Кроме того, используйте print_r и die's для выполнения базовой отладки, чтобы увидеть, соответствуют ли ожидаемые значения фактическим значениям. – webbiedave

ответ

2

Многих вещей неправильно с этим кодом.

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

2 появляется, как будто на самом деле используется только около 6 строк кода.

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

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

3 Youre просят, чтобы получить SQL инъекции здесь:

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

если $ _GET [ 'кошка'] является

'';delete * from cats 

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

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

И все ваши кошек нет

mysql_real_escape_string(), если вы должны использовать функции mysql_

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

+0

не имеет ничего общего с проблемой. – chris

+0

В основном, как вы переписываете переменные $ _GET? – chris

+0

Если вы действительно прочитали мой ответ, вы увидите, что я спросил вас в конце о вашей проблеме. Это было до того, как вы отредактировали свой вопрос и добавили дополнительную информацию. – Galen

1

Хорошо, ваш код никогда не будет работать.Учитывая Ваш запрос о

/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. Там нет параметра 'кот' в вашем запросе (и, следовательно, не будет в $ _GET либо), поэтому empty() возвращает true, сбрасывается, и поэтому «составная часть 1» никогда не выполняется.
  2. В вашем запросе нет параметра «продукта» (и, следовательно, он не будет в $ _GET), поэтому elseif является ложным и, следовательно, не выполняет раздел «составная часть 2».

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

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

testscript.php лет = чувак:

<? 
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 не обновляется автоматически с новым значением. Теперь у вас есть непоследовательные данные, и это потенциально может полностью нарушить ваше приложение.