1

我有下面的 php 脚本来从数据库中获取数据并将其作为预订系统的一部分返回到日历中。标题字段,$row["title"]实际上是每个预订的不同人的用户名。

一切正常,但我想改变一些事情,以便每个用户只能在日历上看到他们自己的用户名,而不是彼此的用户名。我希望他们看到“已预订”。

我对 php 很陌生,但我的猜测是我需要遍历创建的数组,如果它与登录用户不匹配$data,则只更改字段。title我认为这将来自我的登录脚本中的这个:

$_SESSION["username"] = $username;     <=== I think this needs to be incorporated into the script and the php loop.

title如果它与登录用户不匹配,我想要做的是用“预订”替换该字段。

我还需要允许所有用户也看到公共条目,例如unavailableholiday-- 所以title应该始终显示这些值。

<?php
$connect = new PDO('mysql:host=localhost;dbname=xxx', 'xxx', 'xxx');
$data = array();
$query = "SELECT * FROM events ORDER BY id";
$statement = $connect->prepare($query);
$statement->execute();
$result = $statement->fetchAll();
foreach($result as $row)
{
    $data[] = array(
        'id'    => $row["id"],
        'title' => $row["title"],
        'start' => $row["start_event"],
        'end'   => $row["end_event"]
    );
}
echo json_encode($data);
?>

假设 Mary 已登录。数据数组将如下所示:

[
    {"id":"365","title":"Kerry","start":"2021-08-19 20:00:00","end":"2021-08-19 20:40:00"},
    {"id":"366","title":"John","start":"2021-08-19 19:00:00","end":"2021-08-19 19:40:00"},
    {"id":"367","title":"Mary","start":"2021-08-20 10:00:00","end":"2021-08-20 10:40:00"},
    {"id":"368","title":"Mary","start":"2021-08-20 12:00:00","end":"2021-08-20 12:40:00"},
    {"id":"369","title":"Betty","start":"2021-08-20 15:00:00","end":"2021-08-20 15:40:00"}
]

但我想在将其发送到日历之前将其更改为:

[
    {"id":"365","title":"booked","start":"2021-08-19 20:00:00","end":"2021-08-19 20:40:00"},
    {"id":"366","title":"booked ","start":"2021-08-19 19:00:00","end":"2021-08-19 19:40:00"},
    {"id":"367","title":"Mary","start":"2021-08-20 10:00:00","end":"2021-08-20 10:40:00"},
    {"id":"368","title":"Mary","start":"2021-08-20 12:00:00","end":"2021-08-20 12:40:00"},
    {"id":"369","title":"booked","start":"2021-08-20 15:00:00","end":"2021-08-20 15:40:00"}
]
4

2 回答 2

1

如果您想访问会话数据,您首先需要启动会话。然后你可以在脚本中使用会话变量

<?php
    session_start();
    
    $connect = new PDO('mysql:host=localhost;dbname=xxx', 'xxx', 'xxx');
    $data = array();
    $query = "SELECT * FROM events ORDER BY id";
    $statement = $connect->prepare($query);
    $statement->execute();
    $result = $statement->fetchAll();
    
    foreach($result as $row) {
        $data[] = array(
            'id'    => $row['id'],
            'title' => isset($_SESSION['username']) && $row['title'] == $_SESSION['username'] ? $row['title'] : 'booked',
            'start' => $row['start_event'],
            'end'   => $row['end_event']
        );
    }
    echo json_encode($data);

旁注,这只有在所有用户名都是唯一的情况下才能正常工作

于 2021-08-19T12:19:43.630 回答
0

如果 SESSION 中的用户名与该行的标题相同,则显示标题,否则显示预定。

扩展:要title在匹配登录用户名或匹配公共/公共字符串时显示该值,请将它们全部堆积到一个IN()条件中。

推荐:

$sql = "SELECT id,
               IF(title IN (?,'unavailable','holiday'), title, 'booked') AS title,
               start_event AS start,
               end_event AS end
        FROM events
        ORDER BY id";
$statement = $connect->prepare($sql);
$statement->execute([$_SESSION['username']]);
echo json_encode($statement->fetchAll(PDO::FETCH_ASSOC));

如果您希望这是一个动态条件,您可以提前准备好您的白名单数组:

$allowTitles = [
    $_SESSION['username'],
    'unavailable',
    'holiday',
];

然后创建必要数量的占位符并将数组提供给execute().

$placeholders = implode(',', array_fill(0, count($allowTitles), '?'));
$sql = "SELECT id,
               IF(title IN ($placeholders), title, 'booked') AS title,
               start_event AS start,
               end_event AS end
        FROM events
        ORDER BY id";
$statement = $connect->prepare($sql);
$statement->execute($allowTitles);
echo json_encode($statement->fetchAll(PDO::FETCH_ASSOC));

PS 我分享@DarkBee 对您的数据库表中唯一名称的担忧。通常,您应该使用 id 来避免任何数据冲突的机会。

于 2021-08-19T12:20:02.800 回答