2011-06-12 104 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

相关问题