手动更新数据库但不通过php

时间:2014-03-15 15:21:05

标签: php mysql insert-into

有人可以指出以下代码无效的原因吗?

$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)

1 个答案:

答案 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();

}