如果您查看上一个问题
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
答案 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...
关于覆盖$ _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尚未使用您的新值自动更新。现在您的数据不一致,这可能会完全破坏您的应用程序。