通过隐藏表单选择和显示mysql数据

时间:2015-06-04 18:24:48

标签: php html mysql

我无法通过MYsql显示所选数据。我已将值存储在我的数据库的字段中,当用户单击提交按钮时,所选电影的评论应该填充但不是。

这是我在php中的表单代码。

    echo "<tr><td>".$utitle."</td><td>".$ucategory."</td><td>".$ulength."</td><td>Thumbs up</td>t<td></td>";
    echo '<form action = "videos.php" method="POST">';
    echo "<td><input type='hidden' name='read' value=".$uid."><input type='submit' value='Read the Review' name='read'></td></tr></form>";

单击按钮时,这是我的代码。

if(isset($_POST['read'])){
    $readReview = "SELECT Review FROM MyVideos WHERE id='$_POST[read]'";            
    $read = $con->query($readReview);
    if($read->num_rows>0){
        while($row=$read->fetch_assoc()){
            echo "Review:".$row['Review']."<br/>";
        }
    }
$read->close(); 
};

感谢。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

将我的评论写回答。

隐藏的输入和提交按钮都具有相同的名称属性。我称之为冲突。另外,它丢弃了第一个属性,即隐藏属性。

此外,您目前的代码向SQL injection开放。使用prepared statementsPDO with prepared statements它们更安全

$id = mysqli_real_escape_string($con, $_POST['read']);
$readReview = "SELECT Review FROM MyVideos WHERE id='id'";
  • 旁注:$_POST['read']需要更改为您为隐藏输入提供的名称属性。

然而,准备好的陈述是要到这里的方式。

  • 请记住将隐藏的输入重命名为您选择的其他内容。

error reporting添加到文件的顶部,这有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:错误报告应仅在暂存时完成,而不是生产。

参考文献:

面向对象的风格

string mysqli::escape_string ( string $escapestr )
string mysqli::real_escape_string ( string $escapestr )

程序风格

string mysqli_real_escape_string ( mysqli $link , string $escapestr )

答案 1 :(得分:1)

在代码中,这一行:

$readReview = "SELECT Review FROM MyVideos WHERE id='$_POST[read]'";

read周围缺少单引号。单引号出现在我们期望的位置:

if(isset($_POST['read'])){
                ^    ^

但除了添加单引号之外,代码易受攻击 SQL注入

预备声明绑定占位符一起使用。假设id中的MyVideos列是字符类型:

  if(isset($_POST['read'])){
      $readReview = 'SELECT Review FROM MyVideos WHERE id=?';
      $sth=$con->prepare($readReview);
      $sth->bind_param('s',$_POST['read']);
      $sth->execute();
      $sth->bind_result($review);
      while($sth->fetch()){
          echo "Review:".htmlentities($review)."<br/>";
      }
      $sth->close();
  }

为了使模式更清晰,上面的代码示例并未检查prepareexecute的返回值。我们真的想检查prepare的回报是否为假,我们不想在此致电bind_paramexecute

如果id列是整数类型,则将's'替换为'i'(作为bind_param中的第一个参数。

htmlentities的使用假定Review列的内容不包含转义/编码的任何HTML标记。

答案 2 :(得分:0)

提交和隐藏字段相同(不确定通过更改检查)

更改查询: -

$readReview = "SELECT Review FROM MyVideos WHERE id='". $_POST[read] . "'"; // If id is varchar type or

$readReview = "SELECT Review FROM MyVideos WHERE id=$_POST[read]";  // If numric type