【问题标题】:Why cannot send just one post comment in PHP?为什么不能在 PHP 中只发送一条评论?
【发布时间】:2013-05-19 04:13:00
【问题描述】:

我正在尝试编写一个 PHP 项目。在这个站点中,人们可以通过登录来分享照片,照片显示在程序主页的 index.php 中。现在我有三个数据库用户的图像和消息。我可以通过保存有关照片的信息来提供用户分享他们的照片,然后从图像表中的数据库中获取它们。现在我想提供一个用户对主页中的照片进行评论。有 textarea 和图片下方的发布按钮。但是当我对图片进行评论时,它不仅注册了相关图片ID,还注册了其他图片ID。为什么会发生这种情况?

这里是部分php代码,我也在必要的部分打开和关闭了数据库连接。

 while($x < mysql_num_rows($result))
        {   
      $picid=mysql_result($result, $x, 'id');
      $name=mysql_result($result, $x, 'imageName');
      $date=mysql_result($result, $x, 'imageDate');

        echo "<div><img src = 'upload/$name' height='300 width='300' /></div>";
        echo "Name: $name   Date: $date";
        echo "<br/>";
       ?>
       <p>Post a Comment</p>

      <form action="<?= $_SERVER['PHP_SELF']?>" method="POST">
      <textarea name="message" cols="70" rows="6" placeholder="Enter a comment">

     </textarea><br/><br/><br/><br/><br/><br/>
      <input type="submit" name="submit" value="Post" style="float:left"><br/><br/>    
      <br/>
      </form>
     <!--<textarea name="message" cols="70" rows="6" ></textarea><br/><br/><br/><br/>   
     <br/><br/>-->
       <?php

        extract($_REQUEST);
        if (isset($submit)) {
          $y=0;
          $email=$_SESSION['email'];
           $asdf = mysql_query("SELECT * from users WHERE email='$email'");
           //var_dump(mysql_error());
            while( $y<mysql_num_rows($asdf) )
           { 
            $iduser=mysql_result($asdf,$y,'id');
             $y++;
          }

               echo "$iduser";
               $sql ="INSERT INTO messages (id_user, message,picid) VALUES   
               ('$iduser','$message','$picid');";

               $rslt = mysql_query($sql);

               if ($rslt== false) {
                echo '<p>Error: cannot execute query</p>';
               }

              } ?>
              <?php

      $x++;

    }

【问题讨论】:

  • yourpage.com?message=');删除 * FROM 消息#
  • 为什么在while循环中。
  • @Orangepill 第一个从数据库图像表中获取照片的数量。第二个用户发布此评论,从用户表中找到与当前用户匹配的用户。
  • @GungFoo DELETE * FROM messages# 是什么意思?
  • echo $sql来检查你的插入查询是否正确。同时在第一个while之前分享查询

标签: php html mysql post


【解决方案1】:

试试这个:

while($x < mysql_num_rows($result)) {   
      $picid=mysql_result($result, $x, 'id');
      $name=mysql_result($result, $x, 'imageName');
      $date=mysql_result($result, $x, 'imageDate');

        echo "<div><img src = 'upload/$name' height='300 width='300' /></div>";
        echo "Name: $name   Date: $date";
        echo "<br/>";
       ?>
       <p>Post a Comment</p>

      <form action="<?= $_SERVER['PHP_SELF']?>" method="POST">
      <textarea name="message" cols="70" rows="6" placeholder="Enter a comment">
     </textarea><br/><br/><br/><br/><br/><br/>
      <input tyep='hidden' name='pic_id' value='<?php= $picid; ?>' />
      <input type="submit" name="submit" value="Post" style="float:left"><br/><br/>    
      <br/>
      </form>
   <?php
  $x++;

    }
 ?>

这是生成表单和图片,当您提交表单时,您将在post 中获得pic_idmessage,并且您已经在$_SESSION 中获得email

现在,尝试插入。

【讨论】:

  • 在 textarea 标签之间写
  • 这是我的错字。感谢您指出。我已经编辑了答案
【解决方案2】:

首先,您在while 循环中执行INSERT 语句。这意味着当他们提交表单时,您的输出循环(顶部的while)将检索记录,并且在构建 HTML 输出时,它将为每个输出记录执行插入。当while 遍历输出记录时,$picid 变量被设置为下一张图片 ID。但是INSERT 在该循环内运行,为每个$picid 添加相同的注释。

让我们暂且不说有更简洁的方法来编写此代码。要么您是新手程序员,要么对项目结构没有太多控制权——这两者都不是坏事,但让我们坚持目前的情况。

即使在您拥有的结构内,此代码也需要进行重大更改。

while($row < mysql_fetch_assoc($result))
{
  // $row is an array with all the columns, 
  //   No need to keep calling a separate function to get the columns.
  //
  //$picid=mysql_result($result, $x, 'id');
  //$name=mysql_result($result, $x, 'imageName');
  //$date=mysql_result($result, $x, 'imageDate');

    echo "<div><img src = 'upload/{$row['name']}' height='300 width='300' /></div>";
    echo "Name: {$row['name']}   Date: {$row['date']}";
    echo "<br/>";

  // Notice the new <input> tag in the FORM below. 
  // You still need to identify which picid to add the message to.
 ?>
   <p>Post a Comment</p>

  <form action="<?= $_SERVER['PHP_SELF']?>" method="POST">
    <input type="hidden" name="picid" value="<?= $row['id']; ?>"/>
    <textarea name="message" cols="70" rows="6" placeholder="Enter a comment">
    </textarea>
    <br/><br/><br/><br/><br/><br/>
    <input type="submit" name="submit" value="Post" style="float:left">
    <br/><br/><br/>
  </form>

   <?php
} // END RESULTS OUTPUT (while)

// BEGIN SUBMIT DATA PROCESSING
if (isset($submit))
{
  // This is not recommended, but it's not the point here.
  extract($_REQUEST);
  //$y=0;
  $email=$_SESSION['email'];
  $result = mysql_query("SELECT * from users WHERE email='{$email}'");

  // Unless an email can have multiple records in [users] table, 
  // the loop is unnecessary.
  //while ($row = mysql_fetch_assoc($result))
  //{ 
    // $row is an array with all the columns, 
    //   No need to keep calling a separate function to get the columns.
    // $iduser=mysql_result($asdf,$y,'id');
    //     $y++;
  //}
  // Instead... This automatically gets the first row from $result.
  $row = mysql_fetch_assoc($result);
  $iduser = $row['id'];

  //echo "$iduser";
  $sql ="INSERT INTO messages (id_user, message,picid) VALUES   
    ('{$iduser}','{$message}','{$picid}');";

  $result = mysql_query($sql);

  if ($result === false)
  {
    echo '<p>Error: cannot execute query</p>';
  }
} // END IF isset($submit)

?>

这是未经测试的,但希望它能让你朝着更好的方向前进。

【讨论】:

    【解决方案3】:

    您正在使用 while 循环 while($x &lt; mysql_num_rows($result)) 插入直到条件结束。

    $picid =mysql_result($result, $x, 'id'); 中给出所有$picid 并且由于isset($submit) 为真,程序将在所有行中插入消息。

    【讨论】:

    • 是的,但是我该如何解决这个问题,只发送相关的 picid 评论?
    • 你必须知道“
      你必须知道“
    • 我应该在哪里“。谢谢。
    【解决方案4】:

    最好你应该尝试使用 AJAx 来评论系统,你遇到这个问题可能是因为这个代码-

    $asdf = mysql_query("SELECT * from users WHERE email='$email'");
               //var_dump(mysql_error());
                while( $y<mysql_num_rows($asdf) )
               { 
                $iduser=mysql_result($asdf,$y,'id');
                 $y++;
              }
    

    【讨论】:

    • 但是通过这段代码我只是将用户与相关图片相关联,因为哪个用户发表评论对我来说是必要的。我如何使用 Ajax 我不知道如何隐藏它。:(
    • 您也可以在会话中维护 iduser(即用户的唯一 ID),然后在需要时从那里检索它。您无需每次都从数据库中进行额外查询。
    • OP 的问题不是如何发送请求。 AJAXifying 不会解决这里的问题。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签