PDO数据库不返回行,只返回查询字符串(pdo对象)。

3

我会直接进入主题:

Mysql数据库 表名 = 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| 

I have 2 classes:

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 token,但仍然没有运气,它实际上返回了NULL,而不是PDO对象。
非常感谢您的帮助。

如果你正在删除行,你不会得到一些行数的结果;相反,数据库只会报告它所做的事情。只有在选择时才会返回行。 - Nathaniel Ford
@Nathaniel Ford 我知道,这就是为什么我只使用 select 来检查查询是否运行的原因。 - Tatarin
1个回答

2
以下是一些你可能会发现有用的发现。第一个来自于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: Array in Update SQL WHERE IN () clause Can I bind an array to an IN() condition?。更新:像这样的东西应该可以工作,但请记住,$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
}

mycar_id 是一个打字错误,已经修复了。另外,我尝试用普通的单个字符串覆盖 implode - 也没有起作用。我会查看那些文章。 - Tatarin
好的,在尝试了一些代码并移动了它们之后,我想我找到了最初的问题。我需要获取对象以查看内容。这很好。你说得对,IN()不喜欢带有多个值的令牌,即使是相同的字符串。我确实获得了值,但是IN()部分仍然无法工作,我该怎么办?或者有没有替代该函数的方法? - Tatarin
@Timur,请查看更新。类似这样的东西应该可以。 - vee
太棒了!我尝试了你的解决方案,它起作用了。今天晚些时候,我会仔细分析你的代码,以完全理解你是如何做到的。谢谢! - Tatarin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接