【问题标题】:How to insert data using wpdb如何使用 wpdb 插入数据
【发布时间】:2013-08-08 10:13:58
【问题描述】:

我写的如下

$name="Kumkum";
$email="kumkum@gmail.com";
$phone="3456734567";
$country="India";
$course="Database";
$message="hello i want to read db";
$now = new DateTime();
$datesent=$now->format('Y-m-d H:i:s');    
global $wpdb;
$sql = $wpdb->prepare(
 "INSERT INTO `wp_submitted_form`      (`name`,`email`,`phone`,`country`,`course`,`message`,`datesent`) values ("
 $name, $email, $phone, $country, $course, $message, $datesent. ')")';

$wpdb->query($sql);

它不工作...它抛出错误...请帮助我纠正它。

【问题讨论】:

    标签: php wordpress


    【解决方案1】:

    使用$wpdb->insert()

    $wpdb->insert('wp_submitted_form', array(
        'name' => 'Kumkum',
        'email' => 'kumkum@gmail.com',
        'phone' => '3456734567', // ... and so on
    ));
    

    来自@mastrianni 的补充:

    $wpdb->insert 为您清理数据,不像 $wpdb->query 需要您使用 $wpdb->prepare 清理查询。两者的区别在于$wpdb->query 允许您编写自己的SQL 语句,其中$wpdb->insert 接受一个数组并为您处理/sql。

    【讨论】:

    • 动态是什么意思? "name" => $name, ?
    • 当然,然后用你的变量替换那些字符串。
    • 抱歉拖了一个老话题,但我想指出$wpdb->insert 为您清理数据,不像$wpdb->query 要求您使用$wpdb->prepare 清理您的查询。两者的区别在于$wpdb->query 允许您编写自己的SQL 语句,其中$wpdb->insert 接受一个数组并为您处理/sql。
    • 你需要第三个参数来指明每个参数的数据类型,否则它们都将被视为字符串。对于“int、float、string”参数,它将是:array('%d', '%f', '%s')
    • @Sasa1234 插入函数使用 _insert_replace_helper,而后者又使用 $this->query( $this->prepare( $sql, $values ) );所以它确实尽可能地照顾了sqli。不过,我会在表名前使用 $wpdb->prefix。
    【解决方案2】:

    只需使用wpdb->insert(tablename, coloumn, format),wp 就会准备好查询

    <?php
    global $wpdb;
    $wpdb->insert("wp_submitted_form", array(
       "name" => $name,
       "email" => $email,
       "phone" => $phone,
       "country" => $country,
       "course" => $course,
       "message" => $message,
       "datesent" => $now ,
    ));
    ?>
    

    【讨论】:

    • 您应该随时添加它。通常在填充数据之后。
    【解决方案3】:

    试试这个

    我最近倾向于 $wpdb-&gt;prepare HERE 并添加到我们的免费课程预订插件中,该插件已在 wordpress.org 上获得批准并将很快上线:

    global $wpdb;
    $tablename = $wpdb->prefix . "submitted_form";
    
    $name     = "Kumkum"; //string value use: %s
    $email    = "kumkum@gmail.com"; //string value use: %s
    $phone    = "3456734567"; //numeric value use: %d
    $country  = "India"; //string value use: %s
    $course   = "Database"; //string value use: %s
    $message  = "hello i want to read db"; //string value use: %s
    $now      = new DateTime(); //string value use: %s
    $datesent = $now->format('Y-m-d H:i:s'); //string value use: %s
    
    $sql = $wpdb->prepare("INSERT INTO `$tablename` (`name`, `email`, `phone`, `country`, `course`, `message`, `datesent`) values (%s, %s, %d, %s, %s, %s, %s)", $name, $email, $phone, $country, $course, $message, $datesent);
    
    $wpdb->query($sql);
    

    谢谢 -弗兰克

    【讨论】:

      【解决方案4】:

      推荐方式(如in codex所述):

      $wpdb->insert( $table_name, array('column_name_1'=>'hello', 'other'=> 123), array( '%s', '%d' ) );
      

      因此,您最好对价值观进行清理 - 始终考虑安全问题。

      【讨论】:

        【解决方案5】:

        您必须正确检查您的quotes

        $sql = $wpdb->prepare(
            "INSERT INTO `wp_submitted_form`      
               (`name`,`email`,`phone`,`country`,`course`,`message`,`datesent`) 
         values ($name, $email, $phone, $country, $course, $message, $datesent)");
        $wpdb->query($sql);
        

        或者你可以用like,

        $sql = "INSERT INTO `wp_submitted_form`
                  (`name`,`email`,`phone`,`country`,`course`,`message`,`datesent`) 
           values ($name, $email, $phone, $country, $course, $message, $datesent)";
        
        $wpdb->query($sql);
        

        阅读http://codex.wordpress.org/Class_Reference/wpdb

        【讨论】:

        • 我相信 wpdb->prepare 需要 2 个参数。这样的东西应该可以工作: $sql = $wpdb->prepare("INSERT INTO wp_submitted_form (name,email,phone,country,course,message,datesent) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s')", $name, $email, $phone, $country , $course, $message, $datesent);另外,如果不使用准备语句或 wpdb->insert,您的第二个答案如何不易受到 sql 注入的影响?
        【解决方案6】:

        SQL 中的问题:

        你可以像这样构造你的sql:

        $wpdb->prepare(
         "INSERT INTO `wp_submitted_form` 
           (`name`,`email`,`phone`,`country`,`course`,`message`,`datesent`) 
           values ('$name', '$email', '$phone', '$country', 
                 '$course', '$message', '$datesent')"
         );
        

        你也可以使用$wpdb-&gt;insert()

        $wpdb->insert('table_name', input_array())
        

        【讨论】:

        • 解析错误:语法错误,C:\wamp\www\new-saraf-travels\wp-content\plugins\submitted-form\submitted-form.php 中的意外 T_VARIABLE 在第 50 行跨度>
        • @Nida 您是否更改了您的 sql 查询?我想你错过了;
        • 最好使用 $wpdb-insert(),参见上面的回复。
        【解决方案7】:
        global $wpdb;
        $insert = $wpdb->query("INSERT INTO `front-post`(`id`, `content`) VALUES ('$id', '$content')");
        

        【讨论】:

        • 使用 $wpdb->insert() 在风格上更好、更简单、更安全,详见其他一些答案。这不是“错误”,只是没有很好地利用 $wpdb。很抱歉挖掘了一篇旧文章,但这非常重要,因为使用 $wpdb->query() 可能会导致准备失败。此外,如果不使用 insert() ,您将不得不摆弄任何自动增量键。查看developer.wordpress.org/reference/classes/wpdb/insert中的用户示例
        【解决方案8】:
        $wpdb->query("insert into ".$table_name." (name, email, country, country, course, message, datesent) values ('$name','$email', '$phone', '$country', '$course', '$message', )");
        

        【讨论】:

        • 永远不要使用它,这就是 mysql 注入发生的方式。
        猜你喜欢
        • 1970-01-01
        • 2017-11-24
        • 2019-10-03
        • 2020-09-03
        • 2011-01-24
        • 2012-06-27
        • 1970-01-01
        • 2020-05-28
        • 1970-01-01
        相关资源
        最近更新 更多