【问题标题】:AJAX won't insert data with single quotes into SQLAJAX 不会将带单引号的数据插入 SQL
【发布时间】:2017-06-22 10:59:42
【问题描述】:

我有以下变量从 HTML 中获取数据:

    $workcarriedout = trim($_POST["workcarriedout"]);

以下语句将此条目插入 SQL 数据库(不是 mySQL 数据库):

$stmt = $db->prepare("INSERT INTO [dbo].[server_log_entries] (work_carried_out)
                    values ('".$workcarriedout."')");

在输入到变量中的数据包含单引号之前,这非常有效。

有人可以告诉我如何使用单引号导入要导入的数据吗?

编辑:如果这有所不同,这里是代码:

<?php
require_once('../settings.php');
// Get the form fields and remove whitespace
var_dump($_POST);

$datetime = trim($_POST["datetime"]);
$servername = trim($_POST["servername"]);
$carriedoutby = trim($_POST["carriedoutby"]);
$workverifiedby = trim($_POST["workverifiedby"]);
$authorisedby = trim($_POST["authorisedby"]);
$workcarriedout = trim($_POST["workcarriedout"]);
$howverified = trim($_POST["howverified"]);
$reason = trim($_POST["reason"]);
$impact = trim($_POST["impact"]);
$rollback = trim($_POST["rollback"]);


try {
    $db = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}


$stmt = $db->prepare("INSERT INTO [dbo].[server_log_entries] (date_time, server_name, carried_out_by, verified_by, authorised_by, work_carried_out, work_verified, change_reason, perceived_impact, rollback_process)
                    values ('$datetime','$servername','$carriedoutby','$workverifiedby','$authorisedby','$workcarriedout','$howverified','$reason','$impact','$rollback')");

$stmt->execute();



socket_close($socket);

?>

【问题讨论】:

标签: php sql ajax


【解决方案1】:

尝试此代码转义单个代码,然后插入到数据库:

$workcarriedout = mysqli_real_escape_string($db, $workcarriedout);
$stmt = $db->prepare("INSERT INTO [dbo].[server_log_entries] (work_carried_out) values ('".$workcarriedout."')");

【讨论】:

    【解决方案2】:

    字符串中的引号破坏了 SQL 插入字符串。为了避免这种尝试:

    $escaped_string = $db->escape_string($workcarriedout); // does the job with the quotes
    
    $stmt = $db->prepare("INSERT INTO [dbo].[server_log_entries] (work_carried_out)
                    values ('".$escaped_string."')");
    

    【讨论】:

    • 嗨 Machado - 感谢您的评论,这样请求将无法通过
    【解决方案3】:
    $stmt = $db->prepare("INSERT INTO [dbo].[server_log_entries] (`work_carried_out`)
                    values ('\'$workcarriedout\'')");
    

    我测试了它,它现在可以工作了

    出了点问题,但我看不到是什么,您和我的查询之间的唯一区别是

    (`date_time`, `server_name` etc..) 
    

    这是我的查询,它有效:/

    $stmt = $db->prepare("INSERT INTO zeljka (`name`,`lastName`) VALUES ('\'$st\'', '\'$sta\''); and it works :////
    

    screenshot inserted data

    【讨论】:

    • 您好 Zeljka - 感谢您的评论,不幸的是这不起作用。数据进入表格时没有 ' 但没有
    • 对不起我的错误,我不明白你想要在表中带有',我将编辑答案
    • 嗨 Zeljka,这对我不起作用,下面是代码当前的样子:$stmt = $db-&gt;prepare("INSERT INTO [dbo].[server_log_entries] (date_time, server_name, carried_out_by, verified_by, authorised_by@987654330 @work_carried_out, work_verified, change_reason, perceived_impact, rollback_process) values ('\'$datetime\'','\'$servername\'','\'$carriedoutby\'','\'$workverifiedby\'','\'$authorisedby\'','\'$escaped_string\'','\'$howverified\'','\'$reason\'','\'$impact\'','\'$rollback\'')");
    • 出了点问题,但我看不到什么,您和我的查询之间的唯一区别是(date_timeserver_name 等)我的查询是 $stmt = $db->prepare("INSERT INTO zeljka (name,lastName) VALUES ('\'$st\'', '\'$sta\''); 它有效 :////
    【解决方案4】:

    你可以这样使用:

    $stmt = $db->prepare("INSERT INTO [dbo].[server_log_entries] (work_carried_out)
                        values ('$workcarriedout')");
    

    【讨论】:

    • 嗨 Ankesh - 感谢您的评论,这仍然给了我同样的问题,即带有单引号的数据不会插入到 SQL 表中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 2023-03-25
    • 2013-03-24
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    相关资源
    最近更新 更多