簡體   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