Я пытаюсь выполнить внутреннее соединение (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
Вы не можете привязывать имя полей так, как вы это делаете. Вам нужно будет построить запрос динамически:
$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
.
Удачи.
s.student_number
.