php请求变量分配$ _GEt

时间:2010-04-22 15:36:55

标签: php variables seo

如果您查看上一个问题

mod rewrite, title slugs and htaccess

我正在使用Col. Shrapnel提出的解决方案 - 但是当我在实际文件中为$ _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

所以我有产品/产品标题与清洁网址/去slug.php?product = slug

然后slug在数据库中搜索匹配slug的记录,并返回上面代码中的product_id。然后构建查询字符串并包含cart.php

2 个答案:

答案 0 :(得分:2)

此代码有很多问题。

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_ functions

,请使用mysql_real_escape_string()

至于你的实际问题。什么不起作用?你收到错误了吗?我们需要更多信息

答案 1 :(得分: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. 您的查询中没有'cat'参数(因此也不会在$ _GET中),因此empty()返回true,否定,因此“stuff part 1”永远不会执行。
  2. 您的查询中没有'product'参数(因此也不会在$ _GET中),因此elseif为false,因此也不会执行'stuff part 2'部分。
  3. 关于覆盖$ _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尚未使用您的新值自动更新。现在您的数据不一致,这可能会完全破坏您的应用程序。