Головная боль внутреннего соединения Oracle oci_execute (): ORA-00920: недопустимый реляционный оператор

1

Я пытаюсь выполнить внутреннее соединение (Oracle называет их equijoins) двумя таблицами, и я просто что-то пропустил, потому что он отличается от внутреннего внутреннего соединения MySQL. Я также новичок в PHP (из Lasso), поэтому я стараюсь быть строгим с моим синтаксисом для моего собственного здравомыслия. Я просмотрел все другие сообщения об этой ошибке, но они не помогли.

Подключение к базе данных Oracle 12c с помощью PHP 5.5.29, 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 line XXX

  • 0
    Вам нужно выбрать s.student_number .
  • 0
    Хорошо. Имейте два разных выбора для двух разных целей. Также, пожалуйста, включите фактический выбор, который выполняется и выдает ошибку.
Теги:

1 ответ

1
Лучший ответ

Вы не можете привязывать имя полей так, как вы это делаете. Вам нужно будет построить запрос динамически:

$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_by_name призывы :dynfield1, :fieldname и :schoolid.

Удачи.

  • 0
    Я думал, что связывание было лучшим способом предотвратить внедрение SQL?
  • 0
    Вы должны быть обеспокоены этим, когда принимаете ввод от чего-то вроде введенного пользователем значения. В этом случае, однако, все ваши значения являются строковыми константами в вашей подпрограмме, поэтому внедрение невозможно. Более того, вы не можете связать имена столбцов - это просто не будет работать. Вы можете связать значения , но не имена столбцов, имена таблиц, кусочки предложения where и т. Д.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню