2014-01-06 142 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仍然會從根本上破壞。