您可以在PDO中运行查询而不进行准备吗?我知道可能出现的SQL注入问题,但我在测试环境中。
我希望能够编写纯MySQL查询并执行它们,而不必准备查询,绑定占位符等...
我希望能够立即执行如下查询。
INSERT INTO table (table_id, car, bike, date) VALUES (1, 'bmw', 'suzuki', 2004)
我似乎直接在此查询上运行execute()时遇到错误。
提前致谢。
答案 0 :(得分:7)
预准备语句的想法主要不是您可以绑定参数,而是可以多次重用已编译的语句,这样可以提高效率。
准备执行工作流程对于一次性使用案例来说并不太不方便,但PDO也提供了其他方法:
exec
执行一个语句并返回受影响的行数。它对初始化内容很有用,但不适用于SELECT
s。query
对于不涉及不受信任的输入的静态查询非常有用。它类似于prepare-execute,但不允许参数,并且不允许重用已编译的查询。由于这些限制,它们通常只应用于静态查询(即查询是纯字符串,而不是通过与变量的连接构造)。
您可以使用quote
方法安全地转义用户输入,因此您可以执行类似
// untrusted data:
$car = 'bmw';
$bike = 'suzuki';
$year = 2004;
...
$dbh->exec('INSERT INTO table (table_id, car, bike, date) VALUES (1, '. $dbh->quote($car) .', '. $dbh->quote($bike) .', '. $dbh->quote($year) .')');
但是这很不方便你最终会使用
$dbh->prepare('INSERT INTO table (table_id, car, bike, date) VALUES (1, :car, :bike, :year)')
->execute(array(':car' => $car, ':bike' => $bike, ':year' => $year));
代替。
答案 1 :(得分:5)
不要使用PDOStatement
直接使用PDO连接对象。
$conn = new PDO("....");
$result = $conn->exec("INSERT INTO table (table_id, car, bike, date) VALUES (1, bmw, suzuki, 2004)");
或
$result = $conn->query("SELECT * FROM table");