2014-01-06 188 views
0

我工作在一个基本网站上,为假期国家提供建议。 首先你喜欢一些国家,然后它会“计算”哪些国家最适合你。 问题是,起初我忘记了,一开始人们能够不止一次地喜欢一个国家。为了防止我想出了这个代码:

<?php 
$db_host = "localhost"; 
$db_username = "root"; 
$db_pass = ""; 
$db_name = "project"; 


$con = mysqli_connect("$db_host","$db_username","$db_pass","$db_name") or die ("could not connect to mysql"); 

$countryID = $_GET["country"]; 

$user = $_GET["user"]; 

$query = "SELECT COUNT(userID) AS identicalLikes FROM likes WHERE userID=".$user." AND countryID=".$countryID.";" // Counts how many times this country is already liked by this user 

$result = mysqli_query($con, $query); 
$row = mysqli_fetch_array($result); 
$identicalLikes = $row['identicalLikes']; 
?> 

然后我请检查是否这个数字是零,所以我知道我是否应该加入到我的数据库,或者没有(因为它已经存在)。

我已经做了一些研究,而且我知道解析是什么。但是因为我不知道问题出在我的查询还是解析中。

有人知道我做错了什么或有更好的建议吗? 制作布尔数据库不是一个选项,因为当更多用户加入网站时,内容会变得非常困难。

+0

使用'mysqli'时,您应该使用参数化查询和['bind_param'](http://php.net/manual/en/mysqli-stmt.bind-param.php)将用户数据添加到您的查询中。 **在本例中,避免使用字符串插值来完成此操作,因为您有严重的[SQL注入漏洞](http://bobby-tables.com/)。 – tadman

+0

谢谢!但是你没有看到的是我用下拉菜单来选择。没有任何字段可以输入字符串。不知道这是100%安全吗? –

+0

**任何**用户数据必须推定为不安全。你的HTML表单有一个下拉菜单意味着什么都没有,因为这可能会改变。即使这个应用程序今天没有暴露给敌对用户,也可能在将来,这样的开发习惯在将来只会带来可怕的麻烦。 [Sony Hack](http://en.wikipedia.org/wiki/PlayStation_Network_outage)是由于这样的错误造成的,这是一个简单的错误,所以要严肃处理,永远不要让它们摆在首位。 – tadman

回答

2

你在你的$ sql中定义的末尾忘了;

$query = "SELECT [...snip...] countryID=".$countryID.";"; // Counts [..snip...] 
                 ^---here 

引述的分号(";")是SQL语句的一部分,而不是终止这一行PHP。

同样,您很容易受到SQL injection attacks的影响,并且没有引用您插入的值(假设它们是字符串),所以即使在修复此PHP语法错误之后,您的SQL仍然会从根本上破坏。