Я не понимаю как "?"используется здесь - PullRequest
1 голос
/ 29 сентября 2011

Итак, у меня есть этот код 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 требует, чтобы каждое поле было помещено в этот оператор.

1 Ответ

4 голосов
/ 29 сентября 2011

это позиционный параметр для подготовленного операторастроковое значение в параметре при выполнении pg_execute

Пример:

// Assume that $values[] is an array containing the values you are interested in.
$values = array(1, 4, 5, 8);

// To select a variable number of arguments using pg_query() you can use:
$valuelist = implode(', ', $values);

// You may therefore assume that the following will work.
$query = 'SELECT * FROM table1 WHERE col1 IN ($1)';
$result = pg_query_params($query, array($valuelist))
     or die(pg_last_error());
// Produces error message: 'ERROR: invalid input syntax for integer'
 // It only works when a SINGLE value specified.

Вместо этого вы должны использовать следующий подход:

$valuelist = '{' . implode(', ', $values . '}'
$query = 'SELECT * FROM table1 WHERE col1 = ANY ($1)';
$result = pg_query_params($query, array($valuelist));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...