Oracle内部联接头痛oci_execute():ORA-00920:无效的关系运算符


Oracle inner join headache oci_execute(): ORA-00920: invalid relational operator

我正试图用两个表实现内部联接(Oracle称之为equixes),但我只是缺少了一些东西,因为它与MySQL内部联接不同。我也是PHP的新手(来自Lasso),所以为了自己的理智,我试图严格遵守我的语法。我已经看了关于这个错误的所有其他帖子,但它们都没有帮助。

使用PHP 5.5.29连接到Oracle 12c数据库,OCI8已在PHP信息页面中安装并验证。

Oracle对内部联接的解释

$login是纯文本,$pw在这个片段之前被散列:

// separate the login types by the "_" character
if (strpos($login, "_") == true) {
    $fieldname = 'web_password_hash';
    $dynfield = 'web_id';
    $dynfield1 = 's.web_id';
} else {
    $fieldname = 'student_web_password_hash';
    $dynfield = 'student_web_id';
    $dynfield1 = 's.student_web_id';
}
$schoolid = '(pcs.schoolid=4 OR pcs.schoolid=5)';
// search custom table for a field with the correct password (parent/student)
$dbc = oci_connect($psusername, $pspassword, $psconnection);
if(!$dbc) {
    echo "Oracle Not connected";
} else {
$stmt = oci_parse($dbc, 'SELECT pcs.student_number AS snumber, :dynfield1 AS loginid, s.ID AS sid, s.family_ident AS famid, s.firstname AS fname, s.last_name AS lname, s.grade_level AS gradelevel 
    FROM pvsis_custom_students pcs, students s 
        WHERE pcs.student_number=s.student_number 
            AND :schoolid 
            AND pcs.field_name=:fieldname 
            AND pcs.string_value=:pw 
            AND s.enroll_status=0;');
// bind parameters to prevent SQL injection         
oci_bind_by_name($stmt, ':dynfield1', $dynfield1);          
oci_bind_by_name($stmt, ':fieldname', $fieldname);
oci_bind_by_name($stmt, ':schoolid', $schoolid);
oci_bind_by_name($stmt, ':pw', $pw);
// execute statement
oci_execute($stmt);

然后我得到的错误是:警告:oci_execute():ORA-00920:/path/to/file行XXX中的关系运算符无效

您不能像在这里那样绑定字段的名称。您需要动态构建查询:

$stmt = oci_parse($dbc, 'SELECT pcs.student_number AS snumber, ' . $dynfield1 . ' AS loginid, s.ID AS sid, s.family_ident AS famid, s.firstname AS fname, s.last_name AS lname, s.grade_level AS gradelevel 
    FROM pvsis_custom_students pcs, students s 
        WHERE pcs.student_number=s.student_number 
            AND ' . $schoolid . '
            AND pcs.field_name=' . $fieldname . '
            AND pcs.string_value=:pw 
            AND s.enroll_status=0;');

删除对:dynfield1:fieldname:schoolidbind_by_name调用。

祝你好运。