繁体   English   中英

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

[英]Manually updating the database but not via php

有人可以指出为什么下面的代码不起作用吗?

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

为什么不起作用?

您使用的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);

更好的方法:准备好的报表

您可以手动转义所有用户输入的内容。 当然可以。 但随着预处理语句 ,你不必对所有逃避烦恼。 绑定变量是单独发送的,因此没有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();

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM