【问题标题】:How do I insert records into my custom WordPress table?如何将记录插入到我的自定义 WordPress 表中?
【发布时间】:2017-07-12 19:23:24
【问题描述】:

我通常更熟悉在 SQL 或 Oracle 数据库中创建 INSERT 语句。

但是,我使用 phpMyAdmin 在 WordPress 中创建了一个名为 CustomerDB 的自定义数据库和自定义表。

我正在尝试使用以下代码将记录插入到自定义表中。

我没有收到任何错误,但没有插入任何记录。

请注意,此时我并不关心sql注入攻击。

一旦我的 INSERT 代码正常工作,我会处理这个问题。

有谁知道为什么下面的代码没有在 WordPress 的表中插入记录?

<?php
//make database accessible
global $wpdb;
// Get data
$customername = $_POST["customername"];
$custaddress = $_POST["custaddress"];
$custcity = $_POST["custcity"];
$custstate = $_POST["custstate"];
$custzip = $_POST["custzip"];


// Database connection
$conn = mysqli_connect("localhost","myuser","mypass","CustomerDB");
if(!$conn) {
die('Problem in database connection: ' . mysql_error());
}

// Data insertion into database
$query = "INSERT INTO ‘CustomerDB.wp_customTable’ ( ‘customername’, ‘custaddress’, ‘custcity’, ‘custstate’,‘custzip’ ) VALUES ( $customername, $custaddress, $custcity, $custstate,custzip )";
mysqli_query($conn, $query);

// Redirection to the success page
header("Location: thankyou.php");
?>

【问题讨论】:

  • 看起来你错过了美元 $ off custzip。
  • ... 还有,mysql_error的使用无效,标识符的引号错误,数据库名和表名需要单独引用,SQL中的字符串字面量需要用单引号括起来,不测试不成功执行且不检索错误消息,SQL 文本中包含潜在的不安全值,

标签: php mysql wordpress


【解决方案1】:

使用反引号代替引号:

$query = "INSERT INTO CustomerDB.`wp_customTable`(`customername`, `custaddress`, `custcity`, `custstate`,`custzip` ) VALUES ( $customername, $custaddress, $custcity, $custstate, custzip )";

【讨论】:

    【解决方案2】:

    作为第一步,修改代码以检查查询是否成功执行。如果执行返回 FALSE,则检索错误。

    举个例子:

    if (!mysqli_query($conn, $sql)) {
       printf('Error: %s',mysqli_error($conn));
    }
    

    mysqli_error 函数检索到的消息应该可以说明问题所在。

    失败不应该是神秘的。我们应该预见到某些事情可能会出错。如果我们的代码不这样做,它会将小指放在嘴角,并带有 Dr.Evil 风格的“我只是假设一切都会按计划进行。什么?”

    添加这个小修改将大大有助于回答所提出的问题:“为什么以下代码没有插入...?


    对于问题,“我如何插入 [rows]...”

    我们注意到 SQL 文本中有几个问题。

    首先,抛弃“智能引用”。要转义标识符,请将它们括在反引号字符中。每个标识符必须单独括起来。如果CustomerDB 是数据库名,wp_customTable 是表名,那么这是错误的:

    ‘CustomerDB.wp_customTable’
    ^                         ^ 
    

    如果我们要引用标识符,那么我们分别引用每个标识符,如下所示:

    `CustomerDB`.`wp_customTable`
    ^          ^ ^              ^
    

    请注意,这些标识符是有效的,实际上不需要反引号。在这种情况下,我们可以省略反引号。我们将把它们留作演示。

    --

    针对 SQL 注入的防御措施 1 是使用带有绑定占位符的预准备语句。不要在 SQL 文本中包含任何可能不安全的值。

    例子:

    $sql = 'INSERT INTO `CustomerDB`.`wp_customTable` ( `customername`'
         . ', `custaddress`, `custcity`, `custstate`, `custzip` )'
         . ' VALUES ( ? , ? , ? , ? , ? )';
    
    if( $sth = mysqli_prepare($conn,$sql) ) {
       mysqli_stmt_bind_param($sth,'sssss'
          ,$customername
          ,$custaddress
          ,$custcity
          ,$custstate
          ,$custzip
       );
       if( mysqli_stmt_execute($sth) ) {
          // statement execution successful
       } else {
          printf("Error: %s\n",mysqli_stmt_error($sth));
       }
    } else {
       printf("Error: %s\n",mysqli_error($conn));
    }
    

    如果出于某种原因我们不能将预准备语句与绑定占位符一起使用,则任何包含在 SQL 文本中的潜在不安全值必须使用mysqli_real_escape_string 函数正确转义。

    --

    另外,如果mysqli_connect 失败,请使用mysqli_connect_error 函数来检索错误消息,而不是mysql_error

    【讨论】:

    • 和 GurV,非常感谢你们两位的好意。我正在尝试解决一些错误。我想我可以解决这些问题,但以防万一,这里是:警告:mysqli_stmt_bind_param():类型定义字符串中的元素数与 C:\xampp\htdocs\Customers\scripts\final 中的绑定变量数不匹配。第 38 行的 php 错误:没有为准备好的语句中的参数提供数据
    • 第一个错误很奇怪,因为我使用了相同的代码和相同数量的字段。
    • msyqli_bind_param 的第二个参数是“类型定义字符串”。这应该是一个包含 五个 's' 字符的文字字符串(假设这些值作为字符串传递。)第 3 到第 7 个参数是要提供的 五个 值. SQL 文本中有 五个 绑定占位符(问号字符)。我正在查看答案中的代码,但没有发现问题。在我看来是对的。如果您修改了此代码,请确保 mysqli_stmt_bind_param 有 七个 参数,从语句句柄开始,然后是类型字符串
    • 典型的疏忽错误。我一发布 cmets 就很快纠正了这一点。感谢您的帮助。
    • @Tairoc:祝你成功。我希望你发现这个答案有帮助。顺便说一句:安全性不是在编写代码后才应用的。我的建议是采用从一开始就安全的编码模式。这样做之前不安全的编码成为一个熟悉的习惯,之前有大量的工作代码需要修复和重新测试。我推荐 OWASP 项目。在这个时代,我们不应该生成易受 SQL 注入或 XSS 攻击的代码owasp.org/index.php/SQL_Injection
    猜你喜欢
    • 2021-01-04
    • 2014-05-19
    • 2016-03-03
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多