Данные не извлекаются из Oracle в PHP с использованием сервера WAMP - PullRequest
1 голос
/ 02 февраля 2020

Я пытаюсь получить данные из Oracle в PHP на сервере WAMP с помощью следующего кода, но данные не извлекаются, и при этом я не получаю никакой ошибки. Но когда я выполняю тот же запрос на Oracle напрямую, я получаю данные. Кроме того, с теми же параметрами соединения в том же файле php, я могу получить данные для другого запроса

$server = "localhost";
$sid = "xe";
$user = "hrs";
$passwd = "hrs123";

$conn = oci_connect($user, $passwd, $server."/".$sid);
if (!$conn) {
    $e = oci_error();
    echo $m['message'], "\n";
    exit;

}
else{
}

$staffno = test_input($_POST['field1']);

if($staffno!='')
{
$exempquery="select stno as stno, nvl(ffname,'')||' '||nvl(lname,'') as fname, substr(gradep,0,1) as grd, nvl(decode(sex,'M','MALE','F','FEMALE'),'') as sex, to_char(birth_dt,'dd-mm-yyyy') as birthdt, to_char(sep_dt,'dd-mm-yyyy') as sepdt, to_char(ret_dt,'dd-mm-yyyy') as retdt, sepdes from emp_master  where stno='$staffno' and ((sep_dt<='31-03-2013' and ret_dt<='31-03-2013') or (sep_dt is null and ret_dt<='31-03-2013'))";


    $exempstid=oci_parse($conn,$exempquery);

    $exempchk=oci_execute($exempstid);
    $exemprow=oci_fetch_array($exempstid, OCI_BOTH);


    $name=$exemprow['FNAME'];
    $grd=$exemprow['GRD'];
    $sex=$exemprow['SEX'];
    $birthdt=$exemprow['BIRTHDT'];
    $sepdt=$exemprow['SEPDT'];
    $retdt=$exemprow['RETDT'];
    $sepdes=$exemprow['SEPDES'];
}

Соединение с базой данных работает нормально. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 03 февраля 2020
  • Проверьте файлы журнала вашего веб-сервера на наличие ошибок

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

    error_reporting(E_ALL);
    ini_set('display_errors', 'On');
    

    Не забудьте удалить их там, где вы положили свой сценарий в производство

  • Рассмотрите возможность использования HEREDO C или NOWDO C для сложных SQL операторы, см. PHP 5.3. "NOWDOCS" облегчает SQL экранирование .

  • Использование OCI_ASSOC вместо (по умолчанию) OCI_BOTH.

  • Прежде чем заходить слишком далеко, вы ДОЛЖНЫ переписать свой оператор SQL, чтобы использовать переменную связывания, поскольку способ объединения $staffno в оператор представляет собой риск безопасности (и повлияет на производительность и масштабируемость). У меня нет ваших данных, но что-то вроде этого - путь к go:

    $exempquery="select stno as stno, nvl(ffname,'')||' '||nvl(lname,'') as fname, substr(gradep,0,1) as grd, nvl(decode(sex,'M','MALE','F','FEMALE'),'') as sex, to_char(birth_dt,'dd-mm-yyyy') as birthdt, to_char(sep_dt,'dd-mm-yyyy') as sepdt, to_char(ret_dt,'dd-mm-yyyy') as retdt, sepdes from emp_master  where stno = :staffnobv and ((sep_dt<='31-03-2013' and ret_dt<='31-03-2013') or (sep_dt is null and ret_dt<='31-03-2013'))";
    
    $s = oci_parse($c, $exempquery);
    if (!$s) {
        $m = oci_error($c);
        trigger_error('Could not parse statement: '. $m['message'], E_USER_ERROR);
    }
    
    $r = oci_bind_by_name($s, ":staffnobv", $staffno);
    if (!$r) {
        $m = oci_error($s);
        trigger_error('Could not bind a parameter: '. $m['message'], E_USER_ERROR);
    }
    
    $r = oci_execute($s);
    if (!$r) {
        $m = oci_error($s);
        trigger_error('Could not execute statement: '. $m['message'], E_USER_ERROR);
    }
    

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

...