Php 在$POST中使用esc#u attr或htmlspecialchars不会';不提交给DB?

Php 在$POST中使用esc#u attr或htmlspecialchars不会';不提交给DB?,php,mysql,escaping,special-characters,Php,Mysql,Escaping,Special Characters,我希望用户能够输入特殊字符,并且仍然提交给数据库 我已经使用输入进行了测试:Dave&'“*,但是它不存储在数据库中。如果我不按照上面的方法使用特殊字符,只使用Dave,它存储得很好 我试过两件事: <p class="clearfix"> <label for="name">name</label> <input class="validate[requir

我希望用户能够输入特殊字符,并且仍然提交给数据库

我已经使用输入进行了测试:Dave&'“*,但是它不存储在数据库中。如果我不按照上面的方法使用特殊字符,只使用Dave,它存储得很好

我试过两件事:

<p class="clearfix">
                        <label for="name">name</label>
                        <input class="validate[required]" id="name" name="name" type="text" value="'.esc_attr($_POST['name']).'">
                    </p>  

这里有两条非常简单的规则:

  • 确保字符串在插入数据库时(且仅在插入数据库时)安全插入数据库
  • 使字符串在屏幕上显示时安全,并且仅在屏幕上显示时安全
  • (类似于添加到XML、添加到URL/GET参数、将数据放入电子邮件等的规则——每个规则都有一种处理方法。)

    因此,在安装到数据库中时,请使用PDO准备的语句或mysqli准备的语句,因为这将使数据对您来说是安全的。如果不能,请将字符串包装到
    mysql\u real\u escape\u string()
    。它不会更改数据库中的内容,只需确保安全输入即可

    在屏幕上显示时,如第二个示例中所示,请使用
    htmlentities()
    mysqlspecialchars()
    。如果您知道如何处理引号,则最好使用mysqlspecialchars,但如果不确定,请使用htmlenties


    当我这样做时,我看到您正在发送电子邮件。请确保从添加到电子邮件标题的值中删除换行符和假边界,并从正文中删除假边界(换行符可以)。最好使用电子邮件脚本,因为它们很难防止垃圾邮件。

    显示更新数据库的代码。如果您没有使用准备好的语句,则需要使用
    mysql\u real\u escape\u string()
    @Barmar:谢谢Barmar,但是用户可以输入
    Dave&Jane
    ,所以我不想逃避&Whoops-完全错过了。现在更新了问题@Barmar。感谢marioThank你的精彩解释。所以实际上我应该为插入-
    'name'=>mysql\u real\u escape\u字符串($\u POST['name'])这样做,'sale\u date'=>mysql\u real\u escape\u字符串($\u POST['payment\u date']))
    ?是,也不是。你将ipn_数据传递给你的电子邮件函数,而你不想将mysql转义值传递给它。因此,你自己创建一个参数副本,只转义进入数据库的参数。谢谢-有意义!现在尝试一个测试:)1分钟。我已经更新了我问题中代码的“name”db插入行。仍然没有插入g如果我使用特殊字符。我可以在之后为电子邮件功能制作一个副本-只是尝试先进行插入。那么,$wpdb类在做什么呢?它可能在做一些愚蠢的事情,比如说“包含狗狗字符,所以我不插入。”“.mysql\u real\u escape\u字符串不会删除这些字符,它使它们更加安全,因此再次搜索这些字符仍然会找到它们。
    <p class="clearfix">
                            <label for="name">name</label>
                            <input class="validate[required]" id="name" name="name" type="text" value="'.htmlspecialchars($_POST['name']).'">
                        </p>  
    
    if(strpos($response['body'], 'VERIFIED') !== false && $_POST['payment_status'] == "Completed") {
        //Assign IPN Post Values to Local Variables
        $comboString = $_POST['txn_id'].$_POST['payment_date'];
    
        $data = explode('~',$_POST['custom']);
    
        $ipn_data = array(
            'name'      => mysql_real_escape_string($_POST['name']),
            'sale_date'     => $_POST['payment_date']
        );
        $ipn_format = array('%s','%s');
        if($ipn_business == $paypal_email) {
    
            $wpdb->insert($wpdb->prefix.'orderdata', $ipn_data, $ipn_format);
            $ipn_data['currency'] = $_POST['mc_currency'];
            $ipn_data['admin_field'] = $_POST['admin_field'];
    
            send_email($ipn_data);
        }
    
    } else {
        exit("IPN Request Failure");
    }