我永远无法执行 SQL 安全查询


I Can Never Execute SQL-Safe Queries?

我正在使用PHP中的ODBC扩展连接到SQL 2000服务器。这是我所面对的:

  1. 我可以使用odbc_exec()或执行查询
  2. 我可以使用odbc_execute()执行查询

在我看来,这两种查询执行方法之间的差异几乎与黑夜和白天一样不同:

  1. odbc_exec()将执行非 SQL 安全查询并返回查询的结果
  2. odbc_execute()odbc_prepare()结合使用,以对数据库执行 SQL 安全查询。但是,odbc_execute()只能返回布尔值,因此不能用于返回SELECT语句的结果,也不能用于检查从UPDATEDELETE语句更新了多少行。

这真的是这一切的工作方式吗,或者是否有某种方法可以转义值以用于odbc_exec()或从odbc_execute()中获取结果?

PHP文档似乎没有解决上述困境的任何解决方案。

谢谢你的时间。

正在运行的查询的资源由 odbc_prepare 函数返回,而不是odbc_execute。

这两个代码块执行相同的操作:

$query=odbc_exec("SELECT * FROM table WHERE userinput=".$hopefully_escaped_user_input);
while($row=odbc_fetch_array($query) {
  //do stuff with $row
}

$query=odbc_prepare("SELECT * FROM table WHERE userinput=?");
odbc_execute($query,Array($user_input);
while($row=odbc_fetch_array($query) {
  //do stuff with $row
}

预准备语句与"指向"预准备语句的资源结合使用。

想象一下,准备好的语句就好像它们是您在SQL中定义的函数/过程,然后您使用资源来"调用"该函数。

这里的例子:

<?php
$res = odbc_prepare($db_conn, $query_string);
if(!$res) die("could not prepare statement ".$query_string);
if(odbc_execute($res, $parameters)) {
    $row = odbc_fetch_array($res);
} else {
    // handle error
}
?>