【问题标题】:fetch one row from oci8 oracle database从 oci8 oracle 数据库中获取一行
【发布时间】:2013-05-30 14:44:35
【问题描述】:

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

【问题讨论】:

    标签: php sql oracle


    【解决方案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});
    

    【讨论】:

    • 谢谢,使用 oci_bind_by_name w/ROWNUM = 1
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 2022-07-21
      相关资源
      最近更新 更多