2013-08-16 133 views
2

我有最奇怪的问题。我写了这个非常简单INSERT查询:简单的MySQL插入不起作用?

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'。我的错误在哪里?

+3

Inb4 copypasta告诉你使用'mysql_'函数有多糟糕。 –

+0

您不应该使用[mysql。*](http://www.php.net/manual/en/function.mysql-query.php)函数,因为它们已被弃用且不安全。改为使用[mysqli](http://php.net/manual/en/mysqli.query.php)或[PDO](http://www.php.net/manual/en/pdo.prepare.php)。 – MisterBla

+1

@Cobra_Fast:这里呢^ –

回答

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扩展迁移出来,并使用pdomysqli代替。

+0

+1这回答了OP问题,并显示了将字符串包含在SQL文本中的正确方法,并将其封装在对mysql_real_escape_string函数的调用中。 – spencer7593

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注入atack“是世界上最简单的事情。你应该从字符串中扫描一些字符来防止这种情况。而做一下PDO一些研究PHP这个链接可以帮助here

+4

不,不......不,请在_least_使用'mysql_real_escape_string' ... –

+1

@JoachimIsaksson或者不要在所有的情况下使用mysql ... mysqli或PDO。 – MisterBla

+0

关注问题,问题不在于“如何让这个更安全或者如何防止SQL注入atack或其他东西”问题是:“为什么这不起作用?”答案是“你把字符串作为非字符串”。代码上还有很多其他的东西需要调整。但现在不是问题。 – Guerra

-1

你需要用字符串中引号:

$query = mysql_query('INSERT INTO sells(id, user, amount, what, country, platform) VALUES (NULL , "'.$user.'", 1, 1, 1, 1)'); 
+1

**没有。**对别的有害的错误查询进行引用并不能解决问题。 – tadman

+0

是的,该查询将起作用。 OP没有询问关于SQLi的预防和用户输入限制。感谢您的反对... –

+1

你不能写这样的代码,并期望它神奇地工作。如果您使用的是mysql_query,则需要** mysql_real_escape_string。没有例外。没有理由。这不是问题,如果它不是原始问题的一部分,没有它,它不是一个有效的答案,以及你的措辞的方式,引号是* only *问题,事实并非如此。你认为这个查询“将起作用”说明了PHP社区如何随意处理SQL注入漏洞。当你能在几秒钟内解决问题时,不要抱怨反对票。 – tadman