PHP警告:oci_fetch_array()期望参数2为long,给定字符串

时间:2014-07-07 06:56:02

标签: php oracle mode oci

我尝试定义function来执行Oracle查询,并使用收到的oci_fetch_array()变量动态设置string的模式。这是功能:

public function db_single_select($conn,$select,$table,$condition,$fetch_mods='') {

    //A string should be sent to "$fetch_mods" with this format: mode1+mode2+etc...  
    //If a value is not passed to '$fetch_mods', it will be the default fetch mode

    $sql = oci_parse($conn, "select $select from $table where $condition");
    $sql_result = oci_execute($sql, OCI_DEFAULT); 
    if($sql_result){
        if(empty($fetch_mods)) {                    
            $res = oci_fetch_array($sql);
        }
        else{
            $res = oci_fetch_array($sql, $fetch_mods);
        }                   
    }
    else{
        $res = FALSE;
    }               
    oci_free_statement($sql);
    return $res;
}

我这样称呼函数:

db_single_select($conn, $select, $table_name, $condition, 'OCI_ASSOC');

我收到此警告:

Warning: oci_fetch_array() expects parameter 2 to be long, string given in db_connect.php on line 61

我知道oci_fetch_array()的第二个参数(模式)应该是数字的,就像它在PHP文档中所说的那样。 http://www.php.net/manual/en/function.oci-fetch-array.php

问题是如何根据函数??

接收的变量设置模式

因为您可以通过使用+符号

分隔多个模式

$row = oci_fetch_array ($stid, OCI_ASSOC+OCI_RETURN_NULLS);

,是否有一种简单的方法可以在函数中接收类似OCI_ASSOC+OCI_RETURN_NULLS的字符串,并设置模式?

2 个答案:

答案 0 :(得分:1)

你似乎误解了constants实际上是什么。在OCI_ASSOC(和其他OCI constants)的特定情况下,它表示一个简单的整数值。这可以通过var_dump(OCI_ASSOC); int(1)的输出来证明。组合OCI_ASSOC+OCI_RETURN_NULLS等常量是一个简单的加法运算,结果为int(5)

要使您的函数正常工作,您应该通过删除周围的撇号直接传递常量:

db_single_select($conn, $select, $table_name, $condition, OCI_ASSOC);

安全警告:

您的代码容易受到SQL Injection的影响(另请参阅PHP manual says about it)。您应该使用parameter binding来减轻攻击的可能性。

答案 1 :(得分:-1)

您必须确定连接是否成功。 检查代码中$conn资源值的返回值。

希望这对你有所帮助。