无法获取$ _POST数据以去除特殊字符

时间:2018-12-06 17:18:49

标签: php mysql session mysqli strip-tags

我的印象是$ _POST是一个全局数据,其中包含来自post-data和session属性中输入的所有数据,因此当按下提交按钮时,它将获取所有数据并剥离所有废话在出于明显的原因将其发送到数据库/电子邮件/ ect之前。我在操作前后放置了回声。所以似乎就过去了。错误

  

strip_tags()期望参数1为字符串,在第58行的/home/buckeye/website/test1.php中给出的数组

但是据我所知,$ _POST是字符串。.为什么它不起作用?

<?php
    //startssession
    session_start();
    //datatostore
    $_SESSION['post-data'] = $_POST;


    $test1 = $_POST["test1"] ;
    $test2 = $_POST["test2"] ;
    $test3 = $_POST["test3"] ;
    $email = $_POST["email"] ;

    ?>



    <html>
    <head>
    <title>test Form</title>
    </head>
    <body>
    <form id="form" class="appnitro"  method="post" action="">
    <h2>Add A Customer</h2>             
    <div>
    <br>



    name<br>
    <input id="element_1" name="test1" type="text" maxlength="20" value=""/> <br>
    address<br>
    <input id="element_1" name="test2" type="text" maxlength="20" value=""/> <br>
    state<br>
    <input id="element_1" name="test3" type="text" maxlength="20" value=""/> <br>
    Email<br>
    <input id="element_1" name="email" type="text" maxlength="20" value=""/> <br>
    </div>  
    <input id="" class="button_text" type="submit" name="submit" value="Submit" />
    </form> 
    </div>
    </body>
    </html>
     <?php



    if (empty($email) && empty($test1) && empty($test2) && empty($test3)) {
        echo 'Please fill in the fields';
        return false;

    }


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


        echo 'post should happen here';
    $_POST = trim(preg_replace('/ +/', ' ', preg_replace('/[^A-Za-z0-9 ]/', ' ', urldecode(html_entity_decode(strip_tags($_POST))))));
       echo '$_POST did happen';












    $con = mysqli_connect("localhost", "user", "pass", "database");

    if (!$con) {
        echo "<br>Error: Unable to connect to MySQL." . PHP_EOL;
        echo "<br>Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
        echo "<br>Debugging error: " . mysqli_connect_error() . PHP_EOL;
        exit;
    }

    echo "<br>Success: A proper connection to MySQL was made! <br>The my_db database is great." . PHP_EOL;
    echo "<br>Host information: " . mysqli_get_host_info($con) . PHP_EOL;



    }
    else
    {
    echo ('Not Set');
    }




    $sql = "INSERT INTO detail (email,test1,test2,test3)VALUES ('$email','$test1','$test2','$test3')";

    if (mysqli_query($con, $sql)) {

        echo "<br>New record created successfully";

         echo '<meta http-equiv="refresh" content="6;url=http://website/test2.php">';



    } else {
        echo "<br>Error: " . $sql . "<br>" . mysqli_error($con);
    } 


    $sql= 'SELECT * FROM detail' ;
    $results = mysqli_query($con, $sql) or die("<br>Bad query: $sql");


    echo "<table border='1'>";
    echo "<tr><td>Name</td></td><td>test1</td><td>test2</td><td>test3</td></tr>";
    while($row = mysqli_fetch_assoc($results)){
       echo" <tr><td>{$row['name']}</td><td>{$row['test1']}</td><td>{$row['test2']}</td></tr>"; 
    }

    echo"</table>";

    ?>

2 个答案:

答案 0 :(得分:1)

  1. 您的基本问题是strip_tags仅适用于字符串。 $_POST是一个数组。您必须在strip_tags数组中的每个项目上运行$_POST。 (附带说明:在某些情况下,单个项目可能本身也可以是数组...)

  2. 转义用户数据应该在 display 上完成,而不是保存到数据库时。

  3. 如果您在转义中想修复错误,则应完全保存用户提交的内容。

  4. strip_tags仍然不会保护您的数据库(例如,它不会阻止'破坏事务,因为您的查询容易受到SQL注入的攻击)。您应该使用参数化查询。

答案 1 :(得分:1)

再一次,错误非常明显。 $_POST是一个数组,而不是单个字符串。

如果要strip_tags中的每个条目$_POST,则需要这样的循环:

    foreach($_POST as $key => $value)
    {
        $_POST[$key] = strip_tags($value);
    }