PHP PDO查询与数组中的参数

时间:2017-08-07 23:32:14

标签: php mysql pdo

我在设置PDO查询时遇到问题。 我的PDO查询如下:

$query= "
SELECT COUNT(k.id) AS total 
FROM members k 
INNER JOIN members_subscription p ON p.id = k.id 
WHERE k.status=? 
AND k.gender IN (?,?) 
AND country= ? 
AND pic1 !="" 
AND galer !=? 
AND video !=? 
AND birthday < ? 
AND birthday > ? 
AND purposes in(?,?,?,?) ";

执行此查询的函数:

$rows_pr = sql_pdo_funct($query, array($status.$gender_one.$gender_two.$location.$gal_prm.$video_prm.$year_old.$purposes ));

如果我设置静态参数,如:

$rows_pr = sql_pdo_funct($query, array(7,2,5,1,0,0,1999-08-08,1992-08-08,1,2,3,4));

我得到正确的值作为查询结果。 但是,如果我试图在PHP中添加动态值,如:

 $status = '7';
 $gender = ',2,5';
 $location= ',1';
 $gal_prm= ',0';
 $video_prm= ',0';
 $year_old= ',1999-08-08,1992-08-08';
 $purposes_prm= ',1,2,3,4';

并将其放在sql_pdo_funct函数中我收到错误消息:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number' in...

函数调用:

$rows_pr = sql_pdo_funct($query,array($status.$gender.$location.$gal_prm.$video_prm.$year_old.$purposes ));

为什么会出现此错误? 我做错了什么以及如何做到这一点?

感谢您提供任何帮助和建议。

3 个答案:

答案 0 :(得分:1)

语法错误,

array($status.$gender_one.$gender_two.$location.$gal_prm.$video_prm.$year_old.$purposes )

尝试使用,代替.

.用于连接,将字符串添加到一起,逗号,用于分隔数组元素。

容易犯错误。

一旦你看到错误完全有意义,因为你基本上将所有数据连接成一个数组项,因此你查询了4个项目,但你只发送了一个。

  

参数编号无效

我更喜欢命名的占位符,更容易跟踪内容。这很容易做到,只需将这些?更改为:country的{​​{1}}等名称,然后在输入数组country中将其更改为等等。它更容易然后阅读[':country' => 1 ....]

<强>更新

这让我觉得错误[1,24,5,2 ... bla bla这是一个不是4的项目

是的,这不会工作

  

如果我设置静态参数,如:

     

$ rows_pr = sql_pdo_funct($ query,array(7,2,5,1,0,0,1999-08-08,1992-08-08,1,2,3,4));

     

我得到正确的值作为查询结果。但是,如果我尝试在PHP中添加动态值,如:

     

$ status =&#39; 7&#39;;
  $ gender =&#39;,2,5&#39;;

那些逗号和东西,是的,不会那样工作。第一部分是$purposes_prm= ',1,2,3,4';之后的部分,因为它在添加时甚至不是有效的数组。

答案 1 :(得分:1)

  

如果您将函数sql_pdo_funct()中的参数传递给 -

$rows_pr = sql_pdo_funct($query, array($status.$gender_one.$gender_two.$location.$gal_prm.$video_prm.$year_old.$purposes ));
  

然后你无法从函数sql_pdo_funct()获得如 -

$rows_pr = sql_pdo_funct($query, array(7,2,5,1,0,0,1999-08-08,1992-08-08,1,2,3,4));
  

你会得到(作为一个字符串)。因为你连接了字符串

$rows_pr = sql_pdo_funct($query, array("7,2,5,1,0,0,1999-08-08,1992-08-08,1,2,3,4"));

注意:你应该引用你的参数,如果你想把params作为字符串分开传递。

  

更新您的参数,如下所示。由于您的?中有12 SQL Query个查询字符串,因此您应该传递12个参数

 $status   = '7';
 $gender   = '2',
 $gender2  = '5';
 $location = '1';
 $gal_prm  = '0';
 $video_prm= '0';
 $year_old = '1999-08-08';
 $year_old2= '1992-08-08';
 $purposes_prm  = '1';
 $purposes_prm1 = '2';
 $purposes_prm2 = '3';
 $purposes_prm3 = '4';

$rows_pr = sql_pdo_funct($query,
   array(
     $status,
     $gender_one,$gender_two,
     $location,
     $gal_prm,
     $video_prm,
     $year_old,
     $year_old2 #Added another birthday params, Because there is 2 birthday conditions
     $purposes_prm,$purposes_prm1,$purposes_prm2,$purposes_prm3 #Added more 3 params, Because there is total 4 params in `IN`
   )
);

答案 2 :(得分:0)

只需用相应的变量替换静态值即可。 当你在array中使用静态值时,它有11个元素,那么只需将这些静态值替换为变量(不要连接这些变量)