我有一个最奇怪的问题。我写了这个非常简单的INSERT
查询:
if(isset($_POST['putUser'])) {
$user = $_POST['user'];
$amount = $_POST['amount'];
$what = $_POST['what'];
$country = $_POST['country'];
$platform = $_POST['platform'];
$query = mysql_query('INSERT INTO sells(id, user, amount, what, country, platform) VALUES (NULL , '.$user.', 1, 1, 1, 1)');
if($query) {
echo 'ok';
} else {
die(mysql_error());
}
}
它不起作用。当我在所有值中使用1
而不是像示例$user
中那样,它会起作用。但是当变量存在时,它会抛出错误Unknown column 'Test username' in 'field list'
。哪里是我的错?
答案 0 :(得分:6)
您传递给查询的值未包含在引号内。当你不在引号内包含一个字符串时,mysql认为它是一个字段名称。你也忘了逃避你的绳子。
$query = mysql_query('INSERT INTO sells (id, user, amount, what, country, platform) '
. 'VALUES (NULL , "' . mysql_real_escape_string($user) . '", 1, 1, 1, 1)');
最后,您应该远离使用mysql
扩展名,而是使用pdo
或mysqli
。
答案 1 :(得分:5)
您将字段用户(字符串)作为非字符串插入尝试:
if(isset($_POST['putUser'])) {
$user = mysql_real_escape_string($_POST['user']);
$amount = $_POST['amount'];
$what = $_POST['what'];
$country = $_POST['country'];
$platform = $_POST['platform'];
$query = mysql_query('INSERT INTO sells(id, user, amount, what, country, platform) VALUES (NULL , "'.$user.'", 1, 1, 1, 1)');
if($query) {
echo 'ok';
} else {
die(mysql_error());
}
}
正如大家对评论所说的那样,你不应该在mysql查询上直接使用帖子信息,这使得“sql injection atack”成为世界上最容易的事情。你应该从字符串scape一些字符来防止这种情况。并在PHP上对PDO进行一些研究,这个链接可以帮助here
答案 2 :(得分:-1)
您需要将字符串包装在引号中:
$query = mysql_query('INSERT INTO sells(id, user, amount, what, country, platform) VALUES (NULL , "'.$user.'", 1, 1, 1, 1)');