2011-06-12 79 views
0

我有一個提交用戶輸入下面的PHP腳本形式(我已經排除它定義了mysql的信息行):爲什麼我的查詢不能執行/爲什麼不是將記錄添加到我的數據庫中?

if (isset($_POST['ttname'])); { 


$dbc = @mysql_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME) OR die('No DB connection'); 

$ttarray = array(1=> $_POST['mon1'], $_POST['mon2'], $_POST['mon3'], $_POST['mon4'], $_POST['mon5'], $_POST['tue1'], $_POST['tue2'], $_POST['tue3'], $_POST['tue4'], 
$_POST['tue5'], $_POST['wed1'], $_POST['wed2'], $_POST['wed3'], $_POST['wed4'], $_POST['wed5'], $_POST['thu1'], $_POST['thu2'], $_POST['thu3'], $_POST['thu4'], 
$_POST['thu5'], $_POST['fri1'], $_POST['fri2'], $_POST['fri3'], $_POST['fri4'], $_POST['fri5']); 

$name = $_POST['ttname']; 

$tt = implode(',', $ttarray); 



$query = "INSERT INTO Timetable ('NAME','TIMETABLE') 
VALUES ($name,$tt)"; 


$result = mysql_query($query,$dbc) or die('Query Failed'); 
} 

然而,每當我嘗試將數據提交到表單查詢未能執行。

如果有人能向我解釋爲什麼會發生這種情況,我將非常感激。

+4

此代碼作爲穀倉門進行SQL注入攻擊。你必須重寫它。 – Tomalak 2011-06-12 11:14:13

回答

1

至少這樣的事情:

$tt = mysql_real_escape_string(implode(',', $ttarray)); 
$query = "INSERT INTO Timetable ('NAME','TIMETABLE') VALUES ('$name','$tt')"; 

1)$tt在所有

2沒有逃脫)你已經厭倦了比可用字段中插入多個值。通過將$tt更改爲'$tt',您將使字段數相同。

1

你正在向mysql_connect傳遞4個參數,AFAIK DB必須是而不是就是其中之一。

resource mysql_connect ([ string $server = ini_get("mysql.default_host") [, string $username = ini_get("mysql.default_user") [, string $password = ini_get("mysql.default_password") [, bool $new_link = false [, int $client_flags = 0 ]]]]]) 

至少是重寫代碼是這樣的(非常詳細):

if (isset($_POST['ttname'])); 
    { 
    $dbc = mysql_connect(DB_HOST, DB_USER, DB_PASS) OR die('No DB connection'); 
    mysql_select_db(DB_NAME); 

    $ttarray = array($_POST['mon1'], $_POST['mon2'], $_POST['mon3'], $_POST['mon4'], $_POST['mon5'], $_POST['tue1'], $_POST['tue2'], $_POST['tue3'], $_POST['tue4'], 
    $_POST['tue5'], $_POST['wed1'], $_POST['wed2'], $_POST['wed3'], $_POST['wed4'], $_POST['wed5'], $_POST['thu1'], $_POST['thu2'], $_POST['thu3'], $_POST['thu4'], 
    $_POST['thu5'], $_POST['fri1'], $_POST['fri2'], $_POST['fri3'], $_POST['fri4'], $_POST['fri5']); 

    $sanitized = array(); 

    foreach($ttarray as $value) 
    { 
     $sanitized[] = mysql_real_escape_string($value); 
    } 

    $name = mysql_real_escape_string($_POST['ttname']); 
    $tt = implode(',', $sanitized); 

    $query = "INSERT INTO Timetable ('name','timetable') VALUES ('".$name."', '".$tt."')"; 
    $result = mysql_query($query, $dbc) or die('Query Failed'); 

    } 

但我你使用PDO準備好的發言在未來,以防止類似的高缺陷查詢強烈建議那。 mysql_real_escape_string是一個很好的功能,但它不是100%準確的,並且不會使您的查詢具有注入功能。

+0

如果正確使用了'mysql_real_escape_string()'''**可以讓你的查詢每一點都像PDO注入證明一樣。請列舉相反的證據。 – Johan 2011-06-12 20:57:45

+0

@Johan當編碼不是UTF-8時,例如。閱讀[mysql_real_escape_string vs pdo](http://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html)或[這個問題在SO](http://stackoverflow.com/questions/2353666/ php-is-mysql-real-escape-string-sufficient-for-cleaning-user-input)來指示 – 2011-06-12 21:05:03