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