GRIG
Новичок
Неожиданное поведение внутри цикла foreach
Помогите разобраться с очередной непоняткой.
Пишу скрипт, который клеит SQL-запрос из кусков строки, посылает его в оракловую базу и как-то выдает результаты на экран. Одна из функций скрипта - подклеивать к запросу разные дополнительные условия в зависимости от того, что выбрал пользователь на экране. Делаю это все по следующей методике:
1) Начальная инициализация - завожу два пустых массива:
$conditions = Array();
$vallist = Array();
2) Проход по пользовательским настройкам. Для каждой настройки, которая влияет на текст запроса, делается примерно следующее:
$conditions[] = 'MYFIELD = :myvalue';
$vallist[ ':myvalue' ] = значение из настройки
3) Подклейка условий к запросу
$sql = основной текст запроса
if( count( $conditions ) > 0 )
{
$sql .= "WHERE " . implode( $conditions, ' AND ' );
}
$sql .= что-то на тему сортировки
4) Передача запроса на исполнение
$stmt = ociparse( $conn, $sql );
foreach( $vallist as $key => $val )
{
(вариант а) ocibindbyname( $stmt, $key, $vallist[$key] );
(вариант б) ocibindbyname( $stmt, $key, $val );
}
ociexecute( $stmt );
$num = ocifetchstatement( $stmt, $result );
и дальше выдача найденного на экран
Неожиданно для себя обнаружил, что вариант а работает нормально, а вариант б работает ненормально. В варианте б база запросто может вернуть не те данные, которые нужны или вообще сказать "не найдено", хотя данные есть. Хотя (по идее) разницы между вариантами совсем никакой.
Чего я тут не понимаю?
Помогите разобраться с очередной непоняткой.
Пишу скрипт, который клеит SQL-запрос из кусков строки, посылает его в оракловую базу и как-то выдает результаты на экран. Одна из функций скрипта - подклеивать к запросу разные дополнительные условия в зависимости от того, что выбрал пользователь на экране. Делаю это все по следующей методике:
1) Начальная инициализация - завожу два пустых массива:
$conditions = Array();
$vallist = Array();
2) Проход по пользовательским настройкам. Для каждой настройки, которая влияет на текст запроса, делается примерно следующее:
$conditions[] = 'MYFIELD = :myvalue';
$vallist[ ':myvalue' ] = значение из настройки
3) Подклейка условий к запросу
$sql = основной текст запроса
if( count( $conditions ) > 0 )
{
$sql .= "WHERE " . implode( $conditions, ' AND ' );
}
$sql .= что-то на тему сортировки
4) Передача запроса на исполнение
$stmt = ociparse( $conn, $sql );
foreach( $vallist as $key => $val )
{
(вариант а) ocibindbyname( $stmt, $key, $vallist[$key] );
(вариант б) ocibindbyname( $stmt, $key, $val );
}
ociexecute( $stmt );
$num = ocifetchstatement( $stmt, $result );
и дальше выдача найденного на экран
Неожиданно для себя обнаружил, что вариант а работает нормально, а вариант б работает ненормально. В варианте б база запросто может вернуть не те данные, которые нужны или вообще сказать "не найдено", хотя данные есть. Хотя (по идее) разницы между вариантами совсем никакой.
Чего я тут не понимаю?