我似乎对一些基本的mysql命令有点麻烦。这是我创建的名为item的表:
mysql> describe item;
+------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+----------------+
| item_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| item_name | varchar(255) | NO | | NULL | |
| item_price | int(10) unsigned | NO | | NULL | |
+------------+------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
这是我用来更新此表的代码行:
$db = mysql_connect('127.0.0.1', 'root', 'mac');
mysql_select_db('spending') or die(mysql_error($db));
$query = 'UPDATE item SET item_name = "' . $_POST['item_name'] . '",
item_price = ' . $_POST['item_price'] . '
WHERE item_id = ' . $_GET['id'] . '';
$result = mysql_query($query, $db) or die(mysql_error($db));
但是每次我运行它时总会抱怨:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE item_id = 1' at line 4
有谁可以告诉我这件事有什么问题?提前谢谢!
答案 0 :(得分:0)
问题在于你没有parameterized your query to prevent MySQL injection。因此,$ _POST和$ _GET变量可以包含任何内容,包括恶意代码。
在这种情况下,你很幸运。其中一个变量可能导致语法错误。黑客可以轻松地将您的任何变量操作到整个表的DROP
,或者从其他表中读取敏感数据。
此外,php的原始MySQL扩展现已弃用。确保使用MySQLi或PDO_MySQL而不是php的MySQL扩展。
答案 1 :(得分:0)
停止使用mysql函数,不推荐使用
现在我们已经解决了这个问题:
//Connect to db
$db = mysqli_connect('127.0.0.1', 'root', 'mac','spending');
if ($db->connect_errno) {
echo "Failed to connect to MySQL: (" . $db->connect_errno . ") " . $db->connect_error;
}
//Prepare our query
$query = $db->prepare('UPDATE item SET item_name = ?,
item_price = ?
WHERE item_id = ?');
//Bind the parameters
$item_name = (string)$_POST['item_name'];
$item_price = (int)$_POST['item_price'];
$item_id = (int)$_POST['id'];
$query->bind_param('sii',$item_name,$item_price,$item_id);
//Execute
$query->execute();
详细了解mysqli:http://codular.com/php-mysqli
答案 2 :(得分:-1)
使用此
$query = 'UPDATE item SET `item_name` = "' . $_POST['item_name'] . '",
`item_price` = ' . $_POST['item_price'] . '
WHERE `item_id` = '.$_GET['id'];