我要直接切入要点:
Mysql数据库tbl=mycars_gallery
|id| car_id|img_thumb |img_link |
-----------------------------------
|5 | 3 |thumb1.jpg|image1.jpg|
|6 | 3 |thumb2.jpg|image2.jpg|
|7 | 3 |thumb3.jpg|image3.jpg|
我有两个班:
上传.class.php
class Upload
{
function __construct()
{
// nothing
}
function deleteCarImgs($car_id,$arr_imgids)
{
//weld all img ids and separate by commas
$img_ids = implode(",",$arr_imgids);
$sql = "SELECT img_link, img_thumb ";
.= "FROM mycars_gallery WHERE car_id = :carid AND id IN(:imgids);";
$params = array(
":carid" => $car_id,
":imgids" => $img_ids
);
//DB processing happens in Database class(100% working)
$dbconn = new Database;
$rows = $dbconn->dbProcess($sql, $params); //doesnt run
}
}
Cars.class.php
class Cars
{
function __construct()
{
// nothing
}
function deleteCompleteCar(3)//car_id is 3
{
$upload = new Upload();
$arr_imgids = array(5,6,7);//these are img_id = 5,6,7 the ones I want to select
$res = $upload->deleteCarImgs($id,$arr_imgids);
var_dump($res);
}
}
var_dump消息:
PDOStatement Object ( [queryString] => SELECT img_link, img_thumb FROM mycars_gallery WHERE car_id = :carid AND id IN(:imgids); )
我需要什么:所有其他函数都正常工作,但对于这个特定的类,它似乎被破坏了。绝对不会发生错误。当我使用vardump时,只显示查询,而不是获取图像链接和拇指。我有一种感觉,这与两个班级之间的互动有关。
我已经做了什么:
- 我已经直接运行sql查询很多次了,它很有效
- 我通过其他类运行数据库PDO函数,它可以工作
- 我还试图摆脱内爆(),并将一个数字字符串"7"传递给:imgsid令牌,但仍然没有成功,它实际上返回了NULL,而不是PDO obj
提前非常感谢。
以下是一些您可能会发现有用的发现。第一个是来自PHP的PDO::prepare手册。但是您正在使用implode()
传递单个字符串,但我认为这仍然是需要记住的重要内容。
例如,在SQL语句的in()子句中,不能将多个值绑定到单个命名参数。
第二和第三可能是由于打字错误:
$sql = "SELECT img_link, img_thumb "; // this semi colon will cause syntax error on the next line.
.= "FROM mycars_gallery WHERE car_id = :carid AND id IN(:imgids);";
在表结构中,您将mycar_id
显示为一列,但在where子句中有car_id
。
最后,我不想复制粘贴的可能解决方案,所以这里有一些可以实现的东西来解决in
问题:
PHP PDO:更新SQL WHERE in()子句中的数组
我可以将数组绑定到IN()条件吗?
更新:
这样的东西应该可以工作,但请记住$arr_imgids
需要是一个数组才能工作:
function deleteCarImgs($car_id, $arr_imgids)
{
$in_sql = ':imgid' . implode(',:imgid', $arr_imgids);
$sql = "SELECT img_link, img_thumb
FROM mycars_gallery WHERE car_id = :carid AND id IN({$in_sql});";
$params = array_merge(
array(":carid" => $car_id),
array_combine(explode(',', $in_sql), $arr_imgids)
);
//DB processing happens in Database class(100% working)
$dbconn = new Database;
$rows = $dbconn->dbProcess($sql, $params); //doesnt run
}