如何将记录插入自定义WordPress表?

时间:2017-02-22 16:10:41

标签: php mysql wordpress

我通常更熟悉在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");
?>

2 个答案:

答案 0 :(得分:1)

使用反引号代替引号:

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

答案 1 :(得分:0)

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

举个例子:

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

mysqli_error函数检索到的消息应该可以告诉我们问题是什么。

失败不应该是神秘的。我们应该预料到某些事情可能会出错。如果我们的代码没有做到这一点,它会把它的小手指放在它的嘴角,用Dr.Evil风格&#34;我只是假设它会所有人都去计划。什么&#34;

添加这一小修改对于回答被问到的问题有很长的路要走:&#34;为什么下面的代码没有插入...?&#34;

关于问题,&#34;如何插入[行] ...&#34;

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

首先,放弃'smartquotes'。要转义标识符,请将它们用反引号字符括起来。每个标识符必须单独附上。如果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