【发布时间】: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 我仍然会收到错误。他们存在的唯一原因是,因为我以前遇到过这个问题。 (也都在我的代码中看到了评论)
-
哪些错误?你得到什么确切的错误信息?