使用oci_parse和oci_execute

时间:2011-11-20 21:31:26

标签: php oracle

我确信这是非常基本的东西,但我似乎无法找到我的错误。

我正在尝试执行以下操作......

$c = db_connect();

$email = addslashes($email);

$sql = "SELECT * FROM RUSER WHERE email LIKE '" . $email . "';";
$query = oci_parse($c, $sql) or die(oci_error($c));
$response = oci_execute($query) or die(oci_error($c));

但我得到oci8 statement Warning: oci_execute(): ORA-00911: invalid character in /path/to/file.php on line 67,其中第67行是分配$response的地方。

这意味着$query有问题吗?但我似乎无法找到那将是什么。原始sql从命令行执行正常。 echoing get_resource_type($query)给出了资源ID ...

我做错了什么?

3 个答案:

答案 0 :(得分:12)

不要在SQL中包含;;不是SQL本身的一部分,它被各种SQL客户端(例如sql * plus)用作分隔符,用于标记要发送到服务器的命令的结尾。

答案 1 :(得分:1)

第一个错误是

$c = oci_connect("user","password","host/dbname") // db_connect() is not true

第二个错误是不应该有“;”在声明中

$sql = "SELECT * FROM RUSER WHERE email LIKE '" . $email . "';";

应该是

$sql = "SELECT * FROM RUSER WHERE email LIKE '" . $email . "'"; 

如果你想比较好用户“=”比LIKE

答案 2 :(得分:1)

是的,分号是一个问题,但不是唯一的问题。

  • 该查询直接将变量字符串注入sql中-这是潜在的漏洞/不安全之处。
  • 如果您在值中未使用任何通配符(例如%_),则无需进行LIKE比较。

建议的代码:

$stmt = oci_parse($conn, "SELECT * FROM RUSER WHERE email = :email");
oci_bind_by_name($stmt, ":email", $email);
oci_execute($stmt);
$count = oci_fetch_all($stmt, $resultSet, 0, -1, OCI_FETCHSTATEMENT_BY_ROW);
// hypothetical outputs:
// $count = 1
// $resultSet = [['id => 3, 'email' => 'example@example.com', ...]]