Я хочу предоставить инструкцию SQL из строки запроса, но все мои усилия приводят к сбрасыванию одинарных кавычек и косых черт.
Во-первых, убедитесь, что вы действительно действительно хотите это сделать. Это созрело для атаки SQL Injection.
Если вы хотите что-то запускать заявления против базы данных MySQL, просто используйте phpMyAdmin или MySQL workbench.
Предполагая, что вы используете mysql, используйте mysql_real_escape_string ()
http://www.php.net/manual/en/function.mysql-real-escape-string.php
как я могу реализовать это в общем виде?
Все запросы должны быть жестко закодированы в вашем скрипте.
Конечно, некоторые из них могут быть динамически построены, но вам разрешено создавать только динамические, а не управляющие структуры 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"; }
или что-то еще.
Конечно, вставленные данные должны быть надлежащим образом экранированы, лишены или привязаны .
Но иногда нам нужно использовать динамический оператор или идентификатор. Принцип один и тот же: все должно быть жестко закодировано в вашем скрипте, и ничего не нужно передавать с клиентской стороны непосредственно в SQL-запрос.
Скажем, чтобы сделать динамическую сортировку, вы можете использовать такой код
$orders=array("name","price","qty"); $key=array_search($_GET['sort'],$orders)); $orderby=$orders[$key]; $query="SELECT * FROM `table` ORDER BY $orderby";
-$orders=array("name","price","qty"); $key=array_search($_GET['sort'],$orders)); $orderby=$orders[$key]; $query="SELECT * FROM `table` ORDER BY $orderby";
или собрать динамическое ГДЕ:
$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";