2010-06-01 113 views
0

我想從查詢字符串中提供一條SQL語句,但是我所有的努力都會導致單引號和斜槓轉義。PHP撇號和查詢字符串

+1

請告訴我們你的代碼,你的輸入和你的輸出。 – 2010-06-01 15:54:57

+4

如果我正確地閱讀你的問題,那麼我會強烈建議不要在查詢字符串中使用SQL查詢。 – 2010-06-01 15:56:10

+0

是的,除此之外,你不應該那樣做...工作與行動... sorta像?action = del => switch $ action case:del =>查詢 – Tobias 2010-06-01 15:57:52

回答

2

首先,確保你確實想要這樣做。 SQL注入攻擊已經成熟。

如果您想要對MySQL數據庫運行語句,只需使用phpMyAdmin或MySQL工作臺即可。

0

我怎麼能在一個通用的 的方式實現這一點?

所有查詢都必須在您的腳本中硬編碼。
當然,它們中的一些可以動態構建,但是隻允許您創建DATA動態,而不是控制結構。
所以,它必須是這樣的:

$name=mysql_real_escape_string($_POST['name']); 
if ($id = intval($_POST['id'])) { 
    $query="UPDATE table SET name='$name' WHERE id=$id"; 
} else { 
    $query="INSERT INTO table SET name='$name'"; 
} 

或本:

if (!isset($_GET['id'])) { 
    $query="SELECT * FROM table"; 
} else { 
    $id = intval($_GET['id']; 
    $query="SELECT * FROM table WHERE id=$id"; 
} 

或什麼的。
當然,插入的數據必須妥善轉義,轉換或binded

但有時我們需要使用動態的操作符或標識符。原理是一樣的:所有的東西都必須在你的腳本中進行硬編碼,沒有什麼可以直接從客戶端傳遞給SQL查詢。
說,做一個動態的排序,你可以使用這樣的代碼

$orders=array("name","price","qty"); 
$key=array_search($_GET['sort'],$orders)); 
$orderby=$orders[$key]; 
$query="SELECT * FROM `table` ORDER BY $orderby"; 

或組裝動態WHERE:

$w=array(); 
if (!empty($_GET['rooms'])) $w[]="rooms='".mysql_real_escape_string($_GET['rooms'])."'"; 
if (!empty($_GET['space'])) $w[]="space='".mysql_real_escape_string($_GET['space'])."'"; 
if (!empty($_GET['max_price'])) $w[]="price < '".mysql_real_escape_string($_GET['max_price'])."'"; 


if (count($w)) $where="WHERE ".implode(' AND ',$w); else $where=''; 
$query="select * from table $where";