简体   繁体   English

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

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

I'm trying to accomplish an inner join (Oracle calls them equijoins) with two tables and I'm just missing something because it's different than MySQL inner joins. 我试图用两个表完成一个内部联接(Oracle称它们为Equijoins),但我只是缺少了一些东西,因为它与MySQL内部联接不同。 I'm also new to PHP (coming from Lasso) so I'm trying to be strict with my syntax for my own sanity. 我也是PHP的新手(来自Lasso),因此出于我自己的理智,我试图严格语法。 I've looked at all the other posts about this error but they haven't helped. 我查看了有关此错误的所有其他帖子,但它们没有帮助。

Connecting to an Oracle 12c database with PHP 5.5.29, OCI8 is installed and verified in php info page. 使用PHP 5.5.29连接到Oracle 12c数据库,已在php信息页面中安装并验证了OCI8。

Oracle's explanation of inner joins Oracle对内部联接的解释

$login is plaintext and $pw is hashed before this snippet: $ 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);

The error I then get is: Warning: oci_execute(): ORA-00920: invalid relational operator in /path/to/file line XXX 我得到的错误是: 警告: oci_execute():ORA-00920: / path / to / file行XXX中的无效关系运算符

You can't bind the name of the fields the way you're doing it here. 您不能像在此处那样绑定字段名称。 You'll need to build the query dynamically: 您需要动态构建查询:

$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;');

Remove the bind_by_name calls for :dynfield1 , :fieldname , and :schoolid . 删除bind_by_name呼吁:dynfield1:fieldname:schoolid

Best of luck. 祝你好运。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM