【问题标题】:Make $id in foreach loop unique使 foreach 循环中的 $id 唯一
【发布时间】:2015-12-26 03:07:29
【问题描述】:

我正在尝试开发一个简单的评论系统。

对于每个新帖子,都会创建一个新列表项。

列表项的 id 是 AUTO_INCREMENT。弹出窗口应插入以下值:帖子的 ID $id、帖子的作者 $autor 和评论用户名的作者

现在的问题是,如果我将元素 listone 的 id 设置为 $row['id'] 行的 id,则 id 是正确的。但是,当我将 listitem 的 id 设置为输入元素 id 的值时,我添加的 id 或其他内容总是与上次添加的帖子/列表项相同的 id 或时间。

应该插入帖子作者的第二个输入元素工作正常。 如何使 ID 独一无二?

    <div data-role="content">                
        <?php
        include("list.php");
        ?>
            <div data-demo-html="true">
                        <ul data-role="listview" data-inset="true" class="ui-listview ui-listview-inset ui-corner-all ui-shadow">

                        <?php foreach ($result as $key => $row): ?>

                            <li id ="listone" name="listone"  data-role="list-divider" role="heading" class="ui-li ui-li-divider ui-bar-b ui-li-has-count ui-first-child"><?php echo $row['date']; ?></li>
                            <li data-corners="false" data-shadow="false" data-iconshadow="true" data-wrapperels="div" data-icon="arrow-r" data-iconpos="right" data-theme="a" >
                            <div class="ui-btn-inner ui-li"><div class="ui-btn-text"><a class="ui-link-inherit"></a><p class="ui-li-aside ui-li-desc"><strong></strong><?php echo $row['time']; ?></p>
                                <p class="ui-li-desc"><strong><?php echo $row['title']; ?></strong></p>
                                <p class="ui-li-desc"><?php echo $row['text']; ?></p>

                                <p class="ui-li-desc"><strong><?php echo $row['town']; ?></strong></p> 
                     <a href="#popupcomment" data-rel="popup" data-position-to="window" data-transition="pop">comment</a>   
                    <button class="commentbtn" data-rel="button" >comment</button>   
            <div id="createcomment" class="comment" data-theme="a" >
    <form data-ajax="false" name="login-form" class="login-form" action="./comments.php" method="post" style="padding:20px 40px;">
        <div class="content">
        <div id="showcomments" data-theme="a" >
    <?php
include("showcomments.php");
?>
    <?php foreach ($comments as $keyComment => $rowComment): ?>
    <div>
    <p class="ui-li-desc"><strong><?php echo $rowComment['username']; ?></strong></p>
                        <p class="ui-li-desc"><?php echo $rowComment['comment']; ?></p>
                        </div>
                <?php endforeach; ?>
</div>
         <input type="hidden" name="id" id="id" value="<?php echo $row['id']; ?>" type="text" />
         <input type="hidden" name="autorpost" id="autorpost" value="<?php echo $row['autor']; ?>" type="text" />
       <textarea rows="1" name="text" id="text" class="foo"></textarea>
        </div>
        <div class="footer">
        <input type="submit" name="submit" value="comment" class="button" data-theme="a"/>          
        </div>  
    </form>
</div>

                            </li>

                <?php endforeach; ?>

        </ul>
                    </div>  
            </div>
        </div>
        </div>

cmets.php:

    $hostname='localhost';
        $user='root';
        $password='';

if(isset($_POST["submit"])){                    
                try {
        $dbh = new PDO("mysql:host=localhost;dbname=searchfood", $user, $password);

        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // <== add this line
        // prepare your query
        $query = 'INSERT INTO comments (username, autorpost, comment, id_post, time) VALUES (?, ?, ?, ?, now())';

        $stmt = $dbh->prepare($query);
        // bind variables
        $stmt->execute(array($_COOKIE['username'], $_POST['autorpost'], $_POST['text'], $_POST['id']));
        // pull last insert id
        $new = $dbh->lastInsertId(); 

        // show success message or redirect, whatever you want
        echo "New Record Inserted Successfully";
        $message['success'] = 'Neuer Benutzer (' . htmlspecialchars($_POST['username']) . ') wurde angelegt, <a href="login.php">weiter zur Anmeldung</a>.';
        header("Location: http://".$_SERVER['HTTP_HOST']."/lendsth/main.php", true, 302);

    }
                catch(PDOException $e)
                {
                        echo $e->getMessage();
                }

    }

【问题讨论】:

  • 什么是输入元素id?
  • 这个隐藏的输入元素和其他隐藏的元素autor应该给cmets.php所需的值。 :)
  • 如何使用微时间的 md5 创建唯一 ID(即md5(microtime(true));)?

标签: php jquery html mysql foreach


【解决方案1】:

我可能会考虑给每个帖子一个完全唯一的 id UUID 有参考。

您可以在 PHP 中使用uniqid()(但它并不是完全随机的,但适合您的用例)。要获得更安全的随机 UUID,您可以使用 ramsey/uuid。

只需将唯一 id 作为字符串保存在数据库中即可。

【讨论】:

  • 感谢您的帮助,但如果我将 listone 的 id 更改为 $id 效果很好,但只有插入失败,每个帖子都可能有一个唯一的 id。
【解决方案2】:

您将每个输入命名为相同。 name="id" 因此,无论您提交什么表单,您都将获得最后一个元素。

你应该给 name 属性一些上下文(因为 name attr 的值是作为表单输入提交的那个)

<?php foreach ($result as $key => $row): ?>
<form action="./comments.php" method="post">
   <input type="hidden" name="authorForm[<?php echo $row['id']; ?>][id]" id="id" value="<?php echo $row['id']; ?>"> </input>  
   <input type="hidden" name="authorForm[<?php echo $row['id']; ?>][autorpost]" id="autorpost" value="<?php echo $row['autor']; ?>"></input>
   <textarea rows="1" name="text" id="text" class="foo"></textarea> 
   <input type="submit" name="submit" value="comment" class="button" data-theme="a"/>          

</form>
<?php endforeach; ?>

已编辑以遵循第一条评论信息:

以下是呈现 2 个表单序列的脚本:

<?php
$result = array(
    array(
    'id' => 1,
    'title' => "title_1",
    'text' => "text_1",
    'town' => "town_1",
    'autor' => "autor_1",
    'time' => "time_1"
    ),
    array(
    'id' => 2,
    'title' => "title_2",
    'text' => "text_2",
    'town' => "town_2",
    'autor' => "autor_2",
    'time' => "time_2"
    ),
);
?>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js" ></script>
<ul >
<?php foreach ($result as $key => $row): ?>
    <li id ="listone" name="listone"><?php echo $row['date'];?></li>
    <li>
    <div >
        <?php echo $row['time'];?> <?php echo $row['title']; ?> <?php echo $row['text'];?> <?php echo $row['town'];?>
        <a href="#popupcomment">comment</a>   
    </div>
    <form name="login-form" action="./comments.php" method="post" >
        <div>
            <input type="hidden" name="id" id="id" value="<?php echo $row['id'];?>"/>  
            <input type="hidden" name="autorpost" id="autorpost" value="<?php echo $row['autor'];?>"/> 
            <textarea name="text" id="text" ></textarea>    
        </div>
        <div class="footer">
            <input type="submit" name="submit" value="comment" />          
        </div>  
    </form>
    </li>
<?php endforeach; ?>
</ul>

正如您在 chrome 检查器的屏幕截图中看到的那样。发送正确的值(带有讨厌的表单输入名称,因为它们不提供上下文)

【讨论】:

  • 我按照您在我的问题中所说的方式对其进行了编辑,但是输入的 id 具有最后创建的列表项的值。那就是好奇。我一无所知。
  • 我在你的 sn-p 中看不出为什么。 :/ 我将使用桌面测试数据进行编辑
  • 如果我将 listone 的 id 更改为 &lt;?php echo $row['id'];?&gt; 一切正常。只有当我将隐藏输入元素的值设置为 $id 时,它才会采用最后创建的帖子的 id。 :)
  • 我推荐你一个像twig这样的模板引擎。和像 Symfony2 这样的框架。你的代码会让你更头疼。
  • 它与弹出窗口有关。我更改了我的代码,现在它可以工作了。 :)
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 2020-05-25
  • 2021-08-21
  • 1970-01-01
  • 2019-12-14
相关资源
最近更新 更多