【问题标题】:php request variables assigning $_GEtphp 请求变量分配 $_GEt
【发布时间】:2010-04-23 02:09:28
【问题描述】:

如果你看一下之前的问题

mod rewrite, title slugs and htaccess

我正在使用上校 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

所以我有 product/product-title-with-clean-url/ 去 slug.php?product=slug

然后 slug 在 db 中搜索具有匹配 slug 的记录并返回 product_id,如上面的代码所示。然后构建查询字符串并包含 cart.php

【问题讨论】:

  • 你使用什么 .htaccess 代码来路由 slug?
  • 我还没到那一步.. 仍在 slug.php 上使用 $_GET 变量进行测试。我被这个难住了
  • GET 分配在哪里?我在包含的代码中没有看到它。此外,使用 print_r's 和 die's 执行基本调试,以查看预期值是否与实际值匹配。
  • $_GET['product_id'] = $URL_array['product_id'];是为了得到任务......?我将在问题中添加更多信息
  • 看起来你发现不重写你的 slug 是行不通的

标签: php variables seo


【解决方案1】:

这段代码有很多问题。

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_ 函数,请使用 mysql_real_escape_string()

至于你的实际问题。什么不工作?你有错误吗?我们需要更多信息

【讨论】:

  • 基本上你如何覆盖 $_GET 变量?
  • 如果您真的阅读了我的回答,您会发现我在最后询问了您的问题。这是在您编辑问题并添加更多信息之前。
  • 您不会“覆盖”获取变量。您将访问者发送到一个新页面,并将获取变量添加到 url。
  • 我覆盖了 $_REQUEST 变量,我不应该发布让你们感到困惑的代码 - 我正在编辑的代码使用 $_REQUEST 来获取变量而不是 $_GET
【解决方案2】:

好的,您的代码将永远无法工作。鉴于您的查询

/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 没有自动更新为您的新值。现在您的数据不一致,这可能会彻底破坏您的应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 2012-03-30
    • 2019-07-25
    • 2011-07-07
    • 2015-06-08
    相关资源
    最近更新 更多