从oci8 oracle数据库中获取一行

时间:2013-05-30 14:44:36

标签: php sql oracle

我有一个从oracle表中返回一行的函数。

我是从oci8返回数据的新手。我希望你能帮助我优化返回一个结果的功能。

我考虑过将ROWNUM = 1添加到sql中,但不确定这是不是最好的情况。另外,返回$ course_listing ['SUBJ_DESC']的索引0似乎很草率。

function getSubject($term_code = false, $subj_code = false)
{
    if(!$term_code || !$subj_code)
        return false;

    $stid = oci_parse($this->conn, "SELECT SUBJECT_DESC FROM szvcourses WHERE TERM_CODE = '{$term_code}' AND SUBJ_CODE = '{$subj_code}'");

    oci_execute($stid);
    oci_fetch_all($stid, $course_listing);

    if(count($course_listing['SUBJECT_DESC']) == 0)
        return false;

    return $course_listing['SUBJECT_DESC'][0];
}

2 个答案:

答案 0 :(得分:1)

我不是PHP程序员,但看起来你正在构建一个包含搜索值的SQL语句。这样做很糟糕。

原因1:SQL注入http://xkcd.com/327/

原因2. Oracle有一个最近的SQL池。如果SQL已经在池中,Oracle将不必再次解析SQL。

您应该使用参数。代码看起来应该是这样的(语法不正确,因为我不知道PHP):

   $stid = oci_parse($this->conn, "SELECT SUBJECT_DESC FROM szvcourses WHERE TERM_CODE = ? AND SUBJ_CODE = ?");
   oci_set_string_parameter($stid, 1, {$term_code}); 
   oci_set_string_parameter($stid, 2, {$subj_code});

答案 1 :(得分:1)

如果您只想返回一行,那么合并WHERE ROWNUM = 1将是最佳选择。这种方法可确保您使用的唯一数据是您想要的确切数据。

SELECT SUBJECT_DESC FROM szvcourses WHERE TERM_CODE = '{$term_code}' AND SUBJ_CODE = '{$subj_code}' AND ROWNUM = 1");