【问题标题】:PDO Database doesn't return rows, only returns query string (pdo object)PDO 数据库不返回行,只返回查询字符串(pdo 对象)
【发布时间】:2023-04-08 15:12:01
【问题描述】:

我要直奔主题了:

Mysql DB 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 节课:

上传.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 时,只显示查询,而不是获取图像链接和拇指。我感觉这与 2 个类之间的交互有关。

我已经做了什么:

  1. 我已经直接跑了很多次sql查询了,效果很好
  2. 我通过其他类运行数据库 PDO 函数,它可以工作
  3. 我还尝试摆脱 implode() 并将单个数字字符串 '7' 传递给 :imgsid 令牌,仍然没有运气,它实际上返回 NULL,而不是 PDO obj

非常感谢。

【问题讨论】:

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

标签: php mysql oop pdo


【解决方案1】:

以下是一些您可能会发现有用的发现。首先来自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 需要是一个数组才能工作:

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 - 效果不佳。我会研究这些文章。
  • 好的,玩转代码后。我想我找到了原来的问题。我需要获取对象才能查看内容。这一切都很好。您对 IN() 不喜欢具有多值的标记是正确的,即使它是相同的字符串。我确实得到了值,但 IN() 部分仍然无法正常工作,我该怎么办?还是该功能的替代品?
  • @Timur,请查看更新。类似的东西应该可以工作。
  • 宾果游戏!我尝试了你的解决方案,它奏效了。今天晚些时候,我将分解您的代码以充分了解您是如何做到的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多