有人可以指出以下代码无效的原因吗?
$insert="insert into $table (id,date,updatedtime,09to10,09to10comments)".
" values ($id,curdate(),curtime(),'test','test1')";
print "query is<br> $insert<br>";
$escaped_insert=mysqli_real_escape_string($connect,$insert);
$check_query=mysqli_query($connect,$escaped_insert);
if(!$check_query)
{
print "unable to update the database";
}
else
{
print "successfully updated the database";
}
它在网页中显示以下错误输出
query is
insert into tasks (id,date,updatedtime,09to10,09to10comments) values (408112,curdate(),curtime(),'test','test1')
unable to update the database
但是我在mysql中执行相同的查询时手动工作。
mysql> insert into tasks (id,date,updatedtime,09to10,09to10comments) values (408
112,curdate(),curtime(),'test','test1');
Query OK, 1 row affected, 46 warnings (0.05 sec)
答案 0 :(得分:3)
您错误地使用了mysqli_real_escape_string()
。它会转义单个字符串,而不是整个查询。如果您有多个用户输入变量,则需要单独转义它们。转义整个SQL查询将不工作。
逃避的目的是防止具有特殊意义的字符具有特殊含义。由于您要转义包含所有引用值的整个SQL查询,因此您还转义引号并阻止它们正确引用这些值。
这是你应该如何使用它:
// Escape ALL the input prior to executing the query
$id = mysqli_real_escape_string($connect, $id);
// The query
$insert = "INSERT INTO $table (ID,`date`,UPDATEDTIME,09TO10,09TO10COMMENTS)
VALUES ($id,CURDATE(),CURTIME(),'test','test1')";
// Execute the query
$check_query = mysqli_query($connect, $insert);
您可以手动转义所有用户输入。那确实有用。但是使用prepared statements,您无需担心完全转义 。绑定变量是单独发送的,因此没有SQL注入的机会(假设您正确使用它)。它不会忘记逃避用户输入,或者错过任何可能用于注入恶意SQL的特殊字符。
以下是您使用预先准备好的陈述的方式:
/* Create a new mysqli object with database connection params */
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
// The query
$insert = "INSERT INTO $table (ID,`date`,UPDATEDTIME,09TO10,09TO10COMMENTS)
VALUES (?,CURDATE(),CURTIME(),'test','test1')";
if ($stmt = $mysqli->prepare($insert)) {
/* Bind parameters: s - string, i - int, etc */
$stmt->bind_param('i', $id);
/* Execute it */
if ($stmt->execute()) {
// Execution successful
// Do whatever you want
}
/* Close statement */
$stmt -> close();
}