我在设置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 ));
为什么会出现此错误? 我做错了什么以及如何做到这一点?
感谢您提供任何帮助和建议。
答案 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作为字符串分开传递。
更新您的参数,如下所示。由于您的
?
中有12SQL 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个元素,那么只需将这些静态值替换为变量(不要连接这些变量)