【问题标题】:MySQL JOIN - json returns data only from one tableMySQL JOIN - json 仅从一张表返回数据
【发布时间】:2018-07-22 18:57:19
【问题描述】:

我有一个小问题,当通过前端的 ajax 放置时 JSON 只返回一个表中的数据,而没有来自 Users 表的 userName。使用 var_dump 检查后端看起来不错:

/home/maciek/Workspace/Communic/public/admin/privMessage.php:11:
     array (size=3)
      0 => 
        object(Privatemessage)[6]
          private 'id' => string '4' (length=1)
          private 'senderId' => string '2' (length=1)
          private 'receiverId' => string '1' (length=1)
          private 'creationDate' => string '2017-06-28 23:49:15' (length=19)
          private 'text' => string 'asdasdasda' (length=10)
          private 'readStatus' => string '1' (length=1)
          **private 'userName' => string 'stefan' (length=6)**

MySQL 查询(单独正确执行并返回所需结果 - 用户名包含在结果中):

SELECT p.*, u.username FROM PrivateMessage p RIGHT JOIN Users u ON p.sender_id=u.id WHERE receiver_id=:receiver_id

Privatemessage 类中使用查询的方法:

    static public function loadAllRcvdPrvMsgsByUserId(PDO $pdo, $receiverId) {
    $stmt = $pdo->prepare("SELECT p.*, u.username FROM PrivateMessage p RIGHT JOIN Users u ON p.sender_id=u.id WHERE receiver_id=:receiver_id");
    $result = $stmt->execute([
        'receiver_id' => $receiverId
    ]);

    $rcvdPrvMsgsArray = [];

    if ($result === true && $stmt->rowCount() > 0) {
        while ($row = $stmt->fetchAll(PDO::FETCH_OBJ)) {

            foreach ($row as $dbPrvMessage) {
                $loadedPrvMsg = new Privatemessage($pdo);
                $loadedPrvMsg->id = $dbPrvMessage->id;
                $loadedPrvMsg->senderId = $dbPrvMessage->sender_id;
                $loadedPrvMsg->receiverId = $dbPrvMessage->receiver_id;
                $loadedPrvMsg->creationDate = $dbPrvMessage->privatemessage_datetime;
                $loadedPrvMsg->text = $dbPrvMessage->privatemessage_text;
                $loadedPrvMsg->readStatus = $dbPrvMessage->privatemessage_readstatus;
                $loadedPrvMsg->userName = $dbPrvMessage->username;

                $rcvdPrvMsgsArray[] = $loadedPrvMsg;
            }
        }
        return $rcvdPrvMsgsArray;
    }
    return null;
}

js ajax:

    function getReceivedPrivateMsg() {
    $
        .ajax({
            url: '../../../rest/rest.php/privateMessage',
            type: 'GET'
        })
        .done(function (response) {

            console.log(response.success);

        })
        .fail(function (error) {
            console.log('Create sent private message error', error);
        });
}

console.log(response.success);在 ajax 中在 Chrome 开发控制台中返回以下内容(同样,userName 缺失):

非常感谢任何帮助!

编辑:我在 Privatemessage 类中实现了 JsonSerializable,但忘记在类中的 jsonSerialize() 方法中返回 userName。

【问题讨论】:

  • 你正在创建一个名为 Privatemessage 的类的实例,这个类是否有一个名为 $username 的属性?
  • 天哪,我在 Privatemessage 类中实现了 JsonSerializable 并忘记在其中返回 userName。谢谢! :)
  • 顺便说一句,没有人使用右连接
  • 是的,我在想这与 MySQL 查询本身有某种关系,结果发现我忘了从 jsonSerialize() 返回 userName。

标签: php mysql json


【解决方案1】:

您的类 Privatemessage 可能需要有一个公共的 $username 属性才能使其工作。这取决于您如何实现 JSON 转换。从评论来看,您似乎正在使用 JsonSerializable,因此您需要确保所有现有字段都在 jsonSerialize 方法中进行说明。


查看您的代码,如果目标只是生成 JSON 响应,我看不出在这里创建 Privatemessage 实例的意义。为什么不直接使用从 PDO 返回的现有对象?

return $stmt->fetchAll(PDO::FETCH_OBJ);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    相关资源
    最近更新 更多