1

我有一个从 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];
}
4

2 回答 2

1

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

原因一: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});
于 2013-05-30T15:01:03.633 回答
1

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

SELECT SUBJECT_DESC FROM szvcourses WHERE TERM_CODE = '{$term_code}' AND SUBJ_CODE = '{$subj_code}' AND ROWNUM = 1");
于 2013-05-30T15:01:21.087 回答