2013-08-22 229 views
2

我要去开门见山:PDO数据库未返回行,只返回查询字符串(PDO对象)

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| 

我有2个类:

Upload.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。我有一种感觉,它与两个互相交流的课程有关。

我已经做了:

  1. 我跑SQL查询直接很多次,它的工作原理
  2. 我通过其他类跑数据库PDO的功能,它的工作原理
  3. 我也试图摆脱implode()并将单个数字字符串'7'传递给:imgsid令牌,仍然没有运气,它实际上返回NULL,而不是PDO obj

多谢先进。

+0

如果你删除行,你不会得到一些行数的结果;相反,数据库只会报告它做了什么。只有选择你会回到行。 –

+0

@Nathaniel Ford我知道,这就是为什么我只使用select来检查查询是否会运行 – Tatarin

回答

2

以下是您可能会觉得有用的一些发现。首先来自PDO::prepare上的PHP手册。但是您使用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: Array in Update SQL WHERE IN() clause

Can I bind an array to an IN() condition?

更新:

像这样的东西应该可以工作,但请记住,$arr_imgids需要是一个AR ray这个工作:

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 
} 
+0

mycar_id是一个错字,已经修复它。另外,我尝试用常规的单个字符串覆盖implode - 没有工作。我会研究这些文章。 – Tatarin

+0

好吧,玩过后移动代码。我想我找到了最初的问题。我需要获取对象才能看到内容。这一切都很好,很好。对于IN()而言,你是对的,不喜欢具有多值的标记,即使它是相同的字符串。我确实得到了值,但是IN()部分仍然不起作用,我该怎么办?或者是否有替代功能? – Tatarin

+0

@Timur,请参阅更新。像这样的东西应该工作。 – vee