Итак, у меня есть этот код PHP:
$tabid = getTabid($module);
if($tabid==9)
$tabid="9,16";
$sql = "select * from field ";
$sql.= " where field.tabid in(?) and";
Теперь, как именно здесь работает ?
?Я смутно понимаю, что в PHP ?:
является троичным оператором, но двоеточие здесь не используется, а ?
является частью запроса Postgresql.
Окончательный запрос выглядит примерно такthis:
select * from field where field.tabid in('9,16')
Итак, знак вопроса заменяется содержимым $ tabid, как это происходит?
Проблема в том, что Postgres не принимает ('9,16')
как целое число, его нужно записать как (9,16)
, так как мне это сделать?Как удалить апострофы?
Большое спасибо за помощь, хорошего дня!
edit: Запрошено больше кода:
$sql.= " field.displaytype in (1,2,3) and field.presence in (0,2)";
с последующимзаявления, я думаю, что это уместно:
if($tabid == 9 || $tabid==16)
{
$sql.= " and field.fieldname not in('notime','duration_minutes','duration_hours')";
}
$sql.= " group by field.fieldlabel order by block,sequence";
$params = array($tabid);
//Running the query.
$result = $adb->pquery($sql, $params);
О, я думаю, что теперь я вижу, я думаю, что это заполнитель, часть функции запроса:
function pquery($sql, $params, $dieOnError=false, $msg='') {
Stuff
$sql = $this->convert2Sql($sql, $params);
}
Теперь, здесь, кажется, весело, вот часть функции convert2Sql:
function convert2Sql($ps, $vals) {
for($index = 0; $index < count($vals); $index++) {
if(is_string($vals[$index])) {
if($vals[$index] == '') {
$vals[$index] = "NULL";
}
else {
$vals[$index] = "'".$this->sql_escape_string($vals[$index]). "'";
}
}
}
$sql = preg_replace_callback("/('[^']*')|(\"[^\"]*\")|([?])/", array(new PreparedQMark2SqlValue($vals),"call"), $ps);
return $sql;
}
Я думаю, что проблема заключается в строке
$vals[$index] = "'".$this->sql_escape_string($vals[$index]). "'";
.Функция sql_escape_string($str)
просто возвращает pg_escape_string($str)
.
Извините за сверхдлинное редактирование, но я все еще не смог пройти мимо, боюсь, спасибо за помощь!
Редактировать 2: Я исправил проблему, все, что нужно было изменить $tabid = "9,16"
на $tabid = array(9,16)
.Я понятия не имею, почему, и мне также пришлось удалить оператор group by, потому что Postgresql требует, чтобы каждое поле было помещено в этот оператор.