2010-06-01 112 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";