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

Php Oracle内部连接oci_execute():ORA-00920:无效的关系运算符,php,oracle,Php,Oracle,我试图用两个表实现内部连接(Oracle称之为Equijoin),但我缺少了一些东西,因为它与MySQL内部连接不同。我也是PHP新手(来自Lasso),所以为了自己的理智,我试图严格遵守语法。我已经看过了关于这个错误的所有其他帖子,但它们都没有帮助 通过PHP5.5.29连接到Oracle 12c数据库,OCI8在PHP信息页面中安装并验证 $login为纯文本,$pw在此代码段之前进行散列: // separate the login types by the "_" character

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

通过PHP5.5.29连接到Oracle 12c数据库,OCI8在PHP信息页面中安装并验证

$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:XXX行/path/to/file中的关系运算符无效

无法按此处的方式绑定字段名称。您需要动态生成查询:

$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
:schoolid
按名称绑定\u调用


祝你好运。

你需要选择
s.student\u number
。好的。为两个不同的目的选择两个不同的选项。另外,请包含实际执行并抛出错误的select。我认为绑定是防止SQL注入的最佳方法?当您接受来自用户输入值之类的输入时,您确实需要关注这一点。然而,在本例中,您的值在例程中都是字符串常量,因此不可能进行注入。更重要的是,您不能绑定列名——这根本不起作用。您可以绑定值,但不能绑定列名、表名、where子句的位和片段等。缺少的:pw字段,也称为密码,是一个用户输入字段。如果您注意到,我将其作为绑定值保留,而不是将其连接到SQL查询中,因为我无法确定连接是否安全——也因为在本例中绑定很好,因为绑定的是值而不是字段名。还要注意,我没有说要删除
:pw
bind\u by\u name
。谢谢。哦,我明白了,谢谢鲍勃。我正在学习所有这些PHP的细微差别:)