【问题标题】:PHP - Saving $row->fetch() to a variable results into bool(false)PHP - 将 $row->fetch() 保存到变量结果为 bool(false)
【发布时间】:2020-12-14 09:27:31
【问题描述】:

我的 fetch() 查询有问题。 由于似乎缺少细节,我将尝试在此处记录我的代码的完整运行。

我能做什么:

  • 显示所有用户
  • 显示所有组织

我不能做什么:

  • 给用户一个组织

用户和组织的结构

用户

class User
{ 
    private $name;
    private $phone;
    private $email;
    private $designation; // Geschäftsführung, IT Leiter
    private $salutation; // Dr.
    private $userID;
    private $organizationID;

    private $Organization; // Class Organization

    public function __construct($user)
    {
        $this->name= $user['fullname'];
        $this->phone = $user['phone'];
        $this->email = $user['email'];
        $this->salutation = $user['salutation'];
        $this->designation = $user['userdesignation'];
        $this->userID = $user['userid'];
        $this->organizationID = $user['userorganizationid'];
    }

组织

class Organization
{
    private $name;
    private $address;
    private $city;
    private $phone;
    private $organizationID;

    public function __construct($organization)
    {
        $this->name = $organization['organizationname'];
        $this->address = $organization['address'];
        $this->city = $organization['city'];
        $this->phone = $organization['phone'];
        $this->organizationID = $organization['userorganizationid'];
    }

我通过调用 /quickticket/user/userorganization 开始一切。 这将打开我的路由:

Route::get('/quickticket/user/userorganization',
[UserController::class, 'indexUserOrganization'])->name('showUserOrganizations');

现在我的 indexUserOrganization 方法在这里被调用:

public function indexUserOrganization() // Shows all Users with their Organization informations in a side
{
   $Users = UserController::getUsers();
   foreach($Users as $User)
   {
        $Organization = UserController::getOrganizationByUser($User);
        UserController::setOrganizationByUser($User, $Organization);
   }

   return view('QuickTicket/User/userorganization')->with('Users', $Users);
}

getUsers() 方法如下:

public function getUsers() // Get all Users without their Organization
{
    try {
        $pdo = new PDO('mysql:host=myhost.de;dbname=mydbname;charset=utf8', 'user', 'XYZ');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    } catch (Exception $e) {
        echo "There was an error connecting to the database";
    }

    $sql = "SELECT `swusers`.`fullname`, `swusers`.`userdesignation`, `swusers`.`phone`, `swusers`.`userorganizationid`,
    `swusers`.`salutation`, `swuseremails`.`email`, `swusers`.`userid`
    FROM `swusers`
    INNER JOIN `swuseremails`
    ON `swuseremails`.`linktypeid` = `swusers`.`userid`
    ORDER BY UPPER(`fullname`)";
    $row = $pdo->prepare($sql);
    $row->execute();
    $users = $row->fetchAll();

    $i = 0;
    foreach($users AS $user)
    {
        $Users[$i] = new User($user);
        $i++;
    }

    return $Users;
}

到目前为止,一切都很好,我可以分别显示用户和组织(仅用户索引 || 组织)。

现在$Organization = UserController::getOrganizationByUser($User) 是下一个被调用的方法。

public function getOrganizationByUser($User) // Get from the User the Organization as object
{
    $organizationID = $User->getOrganizationID();
    $Organization = OrganizationController::getOrganizationByUserOrganizationID($organizationID);

    return $Organization;
}

后跟OrganizationController::getOrganizationByUserOrganizationID($organizationID) 数据库连接与我的 UserController 中的相同。

public static function getOrganizationByUserOrganizationID($organizationID) 
{
    $pdo = OrganizationController::DBConnection();

    $sql = "SELECT `organizationname`, `address`, `city`, `phone`, `userorganizationid`
    FROM `swuserorganizations`
    WHERE `userorganizationid` = :organizationID";


    $row = $pdo->prepare($sql);
    $row->bindParam(':organizationID' , $organizationID);
    $row->execute();
    //var_dump($row->fetch());
    $organization = $row->fetch();
    //var_dump($organization);
    $Organization = OrganizationController::ArraytoClass($organization);



    return $Organization;
}

(var_dumps 都被注释掉了!)

方法 $Organization = OrganizationController::ArraytoClass($organization) 看起来像这样:

public static function ArraytoClass($organization)
{
    $Organization = new Organization($organization);


    return $Organization;
}

现在当在 ArraytoClass 方法中调用构造函数时,它会给出错误消息:

错误异常 尝试访问 bool 类型值的数组偏移量

(\app\Classes\QuickTicket\Organization.php:16)
(Line 16 = $this->name = $organization['organizationname'];)

现在我试图找出问题出在哪里。 因此我在$row->fetch()$organization 上使用过一次var_dumps

我是否应该在 $row->fetch() 执行此操作,它会显示我的数组以及那里的正确数据,而不需要 bool(false)

但是,如果我现在注释掉 fetch() 的 var_dump 并将其用于 $organizations,它会在那里返回一个 bool(false)

我只寻找 5 个属性,这些属性正确返回给我(在本例中,organizationID = 20 和直接在 PHPMyAdmin 中的 SQL 命令可以正常工作)

var_dump($organization) = array(10) { ["organizationname"]=> string(8) "XXXXXXXX" [0]=> string(8) "XXXXXXXX" ["address"]=> string(0) "" [1]=> string(0) "" ["city"]=> string(0) "" [2]=> string(0) "" ["phone"]=> string(11) "01234567891" [3]=> string(11) "01234567891" ["userorganizationid"]=> int(20) [4]=> int(20) } bool(false)

我还是个初学者,不明白这是怎么回事。 fetchAll() 可以工作,但随后必须在组织的构造函数中访问它,例如像这样:$this->name = $organization[0]['organizationname'];

我希望现在更清楚了。

注意* 没有活动的 var_dump(),只是为了看看示例中为什么会发生这种情况!

【问题讨论】:

  • $row->fetch() 将光标前进到下一个结果集并返回它(如果没有更多结果,则返回 false)。
  • @EmanuelVintilă 你好,如果我 var_dump 我的 fetch() 它会在没有 bool(false) 的情况下返回我的数据。但正如您在我的示例中看到的那样,我得到了所有想要的数据。或者我理解错了什么?
  • 请出于对神圣事物的热爱,从您的代码中删除每一个 var_dump。这就是你所需要的
  • @YourCommonSense 已经做到了,我还在我的笔记中告诉过,没有 var_dump 我仍然会收到错误。他们存在的唯一原因是,因为我以前遇到过这个问题。 (也都在我的代码中看到了评论)
  • 哪些错误?你得到什么确切的错误信息?

标签: php mysql sql pdo


【解决方案1】:

docs表示$fetch_style,也就是fetch()的第一个参数默认为PDO::FETCH_BOTH,即:

PDO::FETCH_BOTH(默认):返回由两列索引的数组 结果集中返回的名称和索引为 0 的列号

所以,我们得到了一个列名/索引 - 列值对的集合,这显然代表了一条记录。这意味着iterator pattern 在此处使用。因此,如果您第一次调用fetch,则会获取第一条记录。如果您第二次调用fetch,那么由于在您第一次调用fetch 时已经获取了第一条记录,您将获取第二条记录,依此类推。您已获取然后再次 var_dumped fetch 并返回 false 值这一事实意味着您的查询已正确执行并返回一条记录。所以,试试这个:

$organization = $row->fetch();
var_dump($organization);

之所以可行,是因为 fetch 只被调用一次,以便获取第一条记录并重用结果,而不是调用两次。

即使在这种特定情况下,您不必迭代结果,因为结果中有一条记录,这就是您可以利用迭代器模式发挥优势的方式:

while ($record = $row->fetch()) {
    //do something with $record
}

【讨论】:

  • 我不明白 fetch 样式与答案的其余部分有什么关系,尤其是与迭代器模式有什么关系。对我来说,这个答案比问题更令人困惑
  • 更不用说这个问题是一个非常明确的话题,问题是由剩余的 var_dump() 的输出引起的
  • 如果我不使用任何 var_dump,它会给我一个错误,我有一个 bool 类型的数组。所以我用这两个 var_dumps 来指定我的问题。如果我使用第一个 var_dump,我会在没有 bool(false) 的情况下返回我的数组如果我(仅)使用第二个 var_dump,直接在 $organization = $row->fetch() 之后我会看到一个 bool(false) 我的问题这里是,即使没有 var_dumps,我的数组也会有一个 bool(false)
  • @YourCommonSense 嗨,你能告诉我评论的 var_dump 将如何影响我的代码吗?我现在已经听过几次了,但是当我的错误出现时,我没有任何 var_dump 没有被评论(类型 bool 上的数组),这些 var_dump 只有在那里,正如我所看到的那样, var_dump($row->fetch() ) 在没有 bool 的情况下给了我正确的结果,一旦我把它放入 $organization 我就会看到 bool。
  • @YourCommonSense 获取方式与询问者调用fetch 的事实有关。人们不会理解fetch 在他们的情况下做了什么,除非他们知道他们的参数(在这种情况下没有)做什么。在我们的例子中,返回列键/值对的事实表明返回了一条记录。这表明它是迭代器模式,应用了类似堆栈的行为。所以,如果你拿东西,那么它就不再存在了。这是提问者需要理解的。
猜你喜欢
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
  • 2016-06-29
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多