2017-02-22 99 views
0

我通常更熟悉在SQL或Oracle数据库中创建INSERT语句。如何将记录插入我的自定义WordPress表格中?

但是,我使用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"); 
?> 
+0

看起来你错过了美元'''关闭custzip。 – thodic

+0

...另外,mysql_error的错误用法,标识符,数据库名称和表名称的错误引号需要单独引用,SQL中的字符串文字需要用单引号括起来,不要测试不成功的执行和不检索错误消息,包含在SQL文本中的潜在的不安全值, – spencer7593

回答

0

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

举个例子:

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

mysqli_error功能检索应该给我们的是什么问题,一些迹象表明该消息。

失败不应该是神秘的。我们应该预料到会出现一些问题。如果我们的代码没有这样做,它就会把它的小手指放在它的嘴角上,用一种Dr.Evil风格“我只是假设它将全部按计划进行,什么?”

并称小的修改会走很长的方式对回答这是问的问题:“为什么下面的代码是不插入...


为了这个问题,“如何我要插入[rows] ...“

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

首先,沟'smartquotes'。要转义标识符,请将它们包含在反引号字符中。每个标识符必须分开包装。如果CustomerDB是数据库名称和wp_customTable是表名,那么这是错误的:

‘CustomerDB.wp_customTable’ 
^      ^

如果我们要引用的标识符,那么我们引用的每个标识符的分开,就像这样:

`CustomerDB`.`wp_customTable` 
^  ^^   ^

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

-

防御1号对SQL注入是使用具有绑定占位符准备语句。不要在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

+0

和GurV,非常感谢您的好意。 我收到一些错误,现在正在努力解决。警告:mysqli_stmt_bind_param():类型定义字符串中的元素数与C中的绑定变量数不匹配:\ xampp \ htdocs \ Customers \ scripts \第38行的final.php 错误:未提供准备好的语句中的参数数据 – Tairoc

+0

第一个错误很奇怪,因为我使用的是相同的代码和相同数量的字段。 – Tairoc

+0

msyqli_bind_param的第二个参数是“类型定义字符串”。这应该是一个包含* 5 *'s'字符的字符串(假设这些值是作为字符串传递的)。第3至7个参数是要提供的* 5 *值。并且在SQL文本中有*五个*绑定占位符(问号字符)。我在回答中查看代码,但我没有看到它的问题。它看起来很适合我。如果您修改了此代码,请确保您有mysqli_stmt_bind_param的*七个*参数,从语句句柄开始,然后是字符串 – spencer7593

1

使用反引号,而不是报价:

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