2011-09-29 76 views
1

所以,我有这样的PHP代码:我不明白“?”这里正在使用

$tabid = getTabid($module); 
if($tabid==9) 
    $tabid="9,16"; 
$sql = "select * from field "; 
$sql.= " where field.tabid in(?) and"; 

现在,这里究竟怎样的?工作?我隐约明白,在PHP中,?:是一个三元运算符,但冒号不在此处使用,?也是Postgresql查询的一部分。

最后的查询看起来有点像这样:

select * from field where field.tabid in('9,16') 

因此,问号是由$ tabid内容所取代,那怎么发生的呢?

问题是('9,16')不被Postgres接受为一个整数,它需要写成像(9,16),所以我该怎么做?我如何删除撇号?

非常感谢您的帮助,有一个美好的一天!

编辑:请求更多代码:

$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); 

哦,我想我现在明白了,我认为这是一个占位符,该pquery功能的一部分:这里

function pquery($sql, $params, $dieOnError=false, $msg='') { 
    Stuff 
    $sql = $this->convert2Sql($sql, $params); 
    } 

现在,这是它似乎变得有趣,是的C的一部分onvert2Sql功能:

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 statement,因为Postgresql要求每个字段都放在该语句中。

+1

你能告诉我们下面的代码吗?这是查询的占位符。 –

+0

你使用ORM的一些亲戚?我们需要用于获取结果的代码..即command.RunQuery或其他代码以及其前面的代码。 – Baz1nga

+0

请参见[关于SQL注入的维基百科文章中的参数化语句段落](http:// en。 wikipedia.org/wiki/SQL_injection#Parameterized_statements)和[维基百科有关Prepared Statements的文章](http://en.wikipedia.org/wiki/Prepared_statement)。 –

回答

4

这是一份准备好的声明

看到一个位置参数:http://php.net/manual/en/function.pg-prepare.php

其实你不“删除”引号,你必须通过整数的SQL数组而不是一个字符串值进入

// 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. 

相反,你必须使用以下approa:做pg_execute

一个例子,当参数ch:

$valuelist = '{' . implode(', ', $values . '}' 
$query = 'SELECT * FROM table1 WHERE col1 = ANY ($1)'; 
$result = pg_query_params($query, array($valuelist)); 
+0

刚刚添加的示例 – sehe

+0

感谢大家,你是对的,它是一个位置参数,我仍然试图理解它的一切,处理替换的函数有点高于我的头,但我会尽快回复! – zermy

+0

原谅我,我不太清楚你在暗示什么,我有点试过你在暗示什么,但我认为代码是用一种稍微不同的方式编写的,即不使用pg_query_params,而是使用函数取而代之。我在上面写了一个稍微罗嗦的编辑,如果你有时间,你能否快速浏览一下,非常感谢你的帮助。 – zermy