【问题标题】:Troubles looping through array with a form使用表单循环遍历数组的问题
【发布时间】:2018-03-31 01:36:59
【问题描述】:

我试图在特定的用户名表中只放置一个用户名。

现在它正在将所有用户名放入表中。

代码:

$top_user_array = array('user1', 'user2', 'user3', 'user4');

$top_user_array = join("', '", $top_user_array);

$query = "SELECT * FROM users WHERE username IN ('{$top_user_array}')";
$send_query = mysqli_query($connection, $query);

while ($row = mysqli_fetch_assoc($send_query)) {
    $author = $row['username'];

    if(isset($_POST['create_sub'])) {

        $username = $_SESSION['username'];

        $query = "UPDATE users SET user_subs = CONCAT(IFNULL(user_subs,''), '{$username}' ',') WHERE username = '{$author}' ";

        $create_user_sub = mysqli_query($connection, $query);

        confirmQuery($create_user_sub);

        $query = "UPDATE users SET user_subscriptions = CONCAT(IFNULL(user_subscriptions,''), '{$author}' ',') WHERE username = '{$username}' ";

        $create_user_subscription = mysqli_query($connection, $query);

        confirmQuery($create_user_subscription);

        echo "Subscribed";
    }

    echo '<form action="" method="post" enctype="multipart/form-data">
            <div class="form-group">
                <button type="submit" name="create_sub" class="btn btn-primary">Subscribe To '. $author; echo ' <i class="fa fa-users" aria-hidden="true"></i></button>
            </div>
        </form>';
}

基本示例:

如果“主用户”订阅了 user1,它会将所有用户放在“主用户”user_subscriptions 行中,而不是仅将特定用户名放在那里。

主用户订阅 user1 后数据库的外观

如果主用户订阅了 user1,它应该如何实际

与@Kodoyosa合作后

这是得到我想要的结果的代码:

$top_user_array = array('user1', 'user2', 'user3', 'user4');

$top_user_array = join("', '", $top_user_array);

$query = "SELECT * FROM users WHERE username IN ('{$top_user_array}')";
$send_query = mysqli_query($connection, $query);

while ($row = mysqli_fetch_assoc($send_query)) {
    $author = $row['username'];

    $author_u = str_replace(' ', '_', $author);    

    if(isset($_POST["create_sub_{$author_u}"])) {

        $username = $_SESSION['username'];

        $query = "UPDATE users SET user_subs = CONCAT(IFNULL(user_subs,''), '{$username}' ',') WHERE username = '{$author}' ";

        $create_user_sub = mysqli_query($connection, $query);

        confirmQuery($create_user_sub);

        $query = "UPDATE users SET user_subscriptions = CONCAT(IFNULL(user_subscriptions,''), '{$author}' ',') WHERE username = '{$username}' ";

        $create_user_subscription = mysqli_query($connection, $query);

        confirmQuery($create_user_subscription);

        echo "Subscribed";
    }

    echo '<form action="" method="post" enctype="multipart/form-data">
            <div class="form-group">
                <button type="submit" name="create_sub_'.$author.'" class="btn btn-primary">Subscribe To '. $author; echo ' <i class="fa fa-users" aria-hidden="true"></i></button>
            </div>
        </form>';
}

【问题讨论】:

  • 如果您将订阅标准化到自己的表中,这会容易得多。

标签: php mysql sql arrays mysqli


【解决方案1】:

如果我说这种模式是一个坏主意,它并不能回答问题,并且将 User 表和 Subscription 表分开会更易于维护

  • User 只会有用户(id、用户名...)
  • Subscription 将有 subscribersubscribed_to

因此您可以轻松地为用户获取订阅或订阅,而无需创建重复的信息

但也许你真的必须这样做,所以不要接受这个建议,让我们试试吧

所以你的问题可能来自if(isset($_POST['create_sub'])),这对每个用户都是正确的(每个用户都进行相同的验证)。

解决办法是:

  1. name="create_sub_'.$author.'" 添加到您的提交按钮
  2. 检查isset($_POST["create_sub_{$author}"] 而不仅仅是if(isset($_POST['create_sub']))

编辑:isset($_POST["create_sub_{$author}"] 必须使用双引号才能将 $author 用作 php 变量

【讨论】:

  • if(isset($_POST['create_sub_'$author])) 带回一条错误消息,提示意外'$author' (T_VARIABLE),期望']'
  • 对不起 if(isset($_POST['create_sub_{$author}'])) 应该可以解决问题(我编辑我的答案)
  • 别担心,我已经试过了,现在什么都没有发送。没有用户被订阅。
  • 如果它不更新也不返回错误,那么 isset 总是假的。你能 var_dump($_POST); (我猜的任何地方)并在提交后查找“create_sub_user1”(如果您单击 user1)。我唯一的猜测实际上是打字错误
  • 如果我做 var_dump($_POST);在 if(isset($_POST['create_sub_{$author}'])) 之后它带回:array(1) { ["create_sub_user1"]=> under each subscribe button
猜你喜欢
  • 2018-02-13
  • 2012-11-21
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多