如何在php中使用GET方法来捕获sql所需的信息

时间:2015-08-12 21:56:42

标签: php mysql

我正在编写一个程序来创建一个在线论坛,我对php相对较新。 我使用了一个while循环来显示为表中的讨论而创建的所有主题。这会读取我的sql数据库,并且很好地回应:

        if ( mysqli_num_rows( $r ) >0 ) {
                while ( $row = mysqli_fetch_array( $r, MYSQLI_ASSOC ) )
            {
                echo "<tr><th><p align = 'left'>"."Posted By ".$row['first_name']." " .$row['last_name']. " on ". $row['post_date']."<br/>";
                echo "<p style = 'color:#2208A1', align='left'>"."Subject:". $row['subject']."<br/><br/>";
                echo "Message: ". $row['message']."<br/>";
                echo "ID Number =  ". $row['post_id']."<br/>";
                echo "<p style='color:red;' align = 'right'>"."<a href='http://localhost/FirstCswkAttempts/2017%20Web%20Scenario_A2/cwk_addreply.php?post_id =" .$row['post_id']." '>Reply to Post."."</a></p>";
                "</tr></th>";                       
            }
        }

但是,您可以看到在最后一行代码中我尝试将post_id编号连接到URL,希望我可以在另一个php文件中使用此信息:

下面的代码显示了我尝试做到这一点。我使用GET方法捕获post_id并将其插入到我的数据库中的另一个表中。如果我使用var_dump($_GET);我得到一个空数组。我哪里错了?

  $q = "INSERT INTO responses(reply_owner, reply_text,reply_create_time,post_id) 
            VALUES (' ".$_POST['email']." ', ' ".$_POST["message"]."', now(),'".$_GET['post_id']."')";
    $r = mysqli_query ( $dbc, $q 

) ;

在回复评论时,请找到用于向主题添加帖子的表单:

            <h1>Reply to Thread</h1>
            <!--Display form-->
            <form action="cwk_reply_action.php" method="post" accept-charset="utf-8">
            <p><strong>Your email:<br><input name="email" type="text" size="55px" maxlength="100"></p>
            <p>Message:<br><textarea name="message" rows="5" cols="50px"></textarea></strong></p>
            <input type = "hidden" name = "post_id" value = "$_GET['post_id'] ">
            <p><input name="submit" type="submit" value="Submit"></p></form>

3 个答案:

答案 0 :(得分:1)

对于PHP应用程序来说,这是一种非常常见的事情。一般模式是:

  1. 从数据库中提取项目列表,并显示链接以与特定项目进行交互。
  2. 单击链接时,显示包含所选项目信息的表单。
  3. 提交表单时,将用户输入保存到所选项目。
  4. 实现此模式所需的最小值如下:

    步骤1(显示项目):

    <?php
    // using mysqli for example here, but the same general idea for pdo or any other
    $result = mysqli_query('SELECT id, some_text, other_columns FROM your_table WHERE criteria');
    while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
        $id = htmlspecialchars($row['id']);
        $text = htmlspecialchars($row['some_text']);
        echo '<a href="url/to/your_form.php?id=' . $id . '">' . $text . '</a><br>';
    }
    ?>
    

    单击链接(<a>)会在其href参数中向URL发送HTTP GET请求。

    第2步(显示表格):

    当PHP处理请求时,您在URL的查询字符串中包含的任何内容(?id=x部分)都将在$_GET数组中提供。 有两种方法可以处理这段数据,以便将其传递给第3步。一种方法是将其包含在表单action参数的URL中:

    <form action="url/to/submission_handler.php?id=<?php echo $_GET['id']; ?>" method="post">
    

    另一种方法是包含一个包含ID的隐藏表单元素。

    <form action="url/to/submission_handler.php" method="post">
        <input type="hidden" name="id" value="<?php echo $_GET['id']; ?>">
    

    第3步(处理表单提交):

    在此步骤中,如果您已通过action参数传递了ID,则该$_GET数组($_GET['id'])中将显示该ID,如果您已通过在表单上输入,它将在$_POST数组中提供。 ($_POST['id'])。 无论哪种方式,您都应该能够访问它以便在查询中使用。

    <?php
    $id = $_GET['id']; // or $_POST['id'], depending on which way you handled it on your form
    
    // Using a prepared statement here for example rather than concatenating values into the 
    // SQL string, in order to reduce risk of SQL injection
    
    // (Assuming $mysli is a connected mysqli object)
    $stmt = $mysqli->prepare('UPDATE your_table SET ... WHERE id=?');
    $stmt->bind_param("i", $id);
    $stmt->execute();
    ?>
    

    将表单中的id传递给处理其提交的脚本的方法都是完全有效,功能齐全且常用的方法。据我所知,你应该采用哪种方式实际上取决于你个人的偏好。 但是您应该注意,在action参数的查询字符串中传递参数只适用于method="post"的表单。如果您需要使用method="get",则只有$_GET中的表单字段中的值才可用;查询字符串中的参数将被忽略。 (对于将在您的服务器上进行更改的表单,(INSERTUPDATEDELETE查询,写入文件等),您应始终使用method="post" ,但仅限FYI。)

答案 1 :(得分:0)

如果您想打印变量,则需要它

<input type = "hidden" name = "post_id" value = "<?php echo $_GET['post_id']; ?> ">

你会看到post_id的值

答案 2 :(得分:-1)

我相信你应该更加具体,但是你的代码看起来很生疏,你需要有人告诉你它是如何完成你对这个脚本的当前uri的呢?

就是这样: http://localhost/forum.php?post_id=foobar 你发送POST或GET请求了吗?你的enctype是什么? 如果它是你可以使用$ _GET超级全局就好了,小心地将它插入你的查询,SQL injection在这一天仍然是一个大问题。

<?php  
       if ( mysqli_num_rows( $response ) >0 ) {
                while ( $row = mysqli_fetch_array( $response, MYSQLI_ASSOC ) )
            {
                echo "<tr>
                        <th>
                        <p align = 'left'> Posted By  {$row['first_name']}  {$row['last_name']}  on  {$row['post_date']} <br/>
                        <p style = 'color:#2208A1', align='left'> 
                                        Subject: {$row['subject']} <br/><br/> Message: {$row['message']} <br/>
                                        ID Number =  {$row['post_id'] }<br/>
                        <p style='color:red;' align = 'right'>
                            <a href='http://localhost/FirstCswkAttempts/2017%20Web%20Scenario_A2/cwk_addreply.php?post_id ={$row['post_id']}'>Reply to Post.</a>
                        </p>
                     </tr>
                </th>";                       
            }

            //This is not recomenended anymore 
            //But since you are not using PDO and prepared statments its not that bad
            $email   = mysql_real_escape_string($_POST['email']);
            $message = mysql_real_escape_string($_POST["message"]);
            $postId  = mysql_real_escape_string($_GET['post_id']);


            //never name your variables less then 4 chars  $q = $query, $r = $response , $dbc = $databaseConnection
            $query   = "INSERT INTO responses( reply_owner, reply_text, reply_create_time, post_id ) VALUES ('$email', '$message', now(),'$postId')";
            $response = mysqli_query ( $databaseConnection, $query );