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