Php 使用包含撇号的字段值的PDO(mysql、innodb)拉取数据不起作用

Php 使用包含撇号的字段值的PDO(mysql、innodb)拉取数据不起作用,php,pdo,json,Php,Pdo,Json,我正在使用准备好的查询并将变量绑定到占位符。这是在插入数据时完成的。这很有效,我通常没有问题 然而,在我们的注册表单上,有人在表单字段中输入了圣约翰的值。数据已成功写入,从我的phpMyAdmin控制台看来还可以。但是,从该记录获取数据的任何尝试都不起作用。执行似乎没有失败,因为我在执行时有一个try/catch,catch会给我发电子邮件。如果我删除撇号,那么我可以正常检索记录 我到处搜索,看到的都是人们说要使用事先准备好的陈述。我正在使用它们。他们还说addslashes()是一件坏事(我不

我正在使用准备好的查询并将变量绑定到占位符。这是在插入数据时完成的。这很有效,我通常没有问题

然而,在我们的注册表单上,有人在表单字段中输入了圣约翰的值。数据已成功写入,从我的phpMyAdmin控制台看来还可以。但是,从该记录获取数据的任何尝试都不起作用。执行似乎没有失败,因为我在执行时有一个try/catch,catch会给我发电子邮件。如果我删除撇号,那么我可以正常检索记录

我到处搜索,看到的都是人们说要使用事先准备好的陈述。我正在使用它们。他们还说
addslashes()
是一件坏事(我不这么认为)。我也尝试过使用
:hospital'=>$db_updo->quote($\u POST['hospital'])
但是结果是插入的字段有额外的撇号,我不希望。也许有某种取消报价的方法

另外,如果知道我正在将整行提取为assoc_数组,然后对其进行json_编码,这样我就可以将其发送回JavaScript,并将其解释为JavaScript,其中数组的每个部分都将写入表单上的相应字段,这可能会很有用

所以,我决定自己问一个问题

示例代码: 插入: “:fname'=>$\u POST['fname'],ENT\u引号

检索: $db_pdo->prepare($statement_SQL)


马修·约翰逊(Matthew Johnson)在提醒我清理数据库数据这一非常重要的步骤时,最接近于一个答案。不信任任何数据源,尤其是如果数据是由经过验证的用户输入的,或者只是一个用户周期

经过大量的谷歌搜索和事实调查,我自己解决了这个问题

我不知道为什么我可以从PHP传递一个JSON_编码数组,并将其输出到一个div id,它可以工作,但是如果数据中有单引号,它就不能工作。JSON_ENCODE数组在JavaScript中可以正常工作,除非某些数据中只有一个引号

我使用$.post请求数据。它很简单并且可以工作,但是我没有指定数据类型。$。post只是简化post Ajax的快捷方式,所以我决定阅读$.Ajax。这允许我指定返回数据类型。另外,我发现没有必要将PHP的输出放入div中。不管怎样,输出都会进入一个名为“data”的变量,可以选择将该“data”放入div中。如果从PHP脚本输出的唯一内容是JSON_ENCODE数组,那么JavaScript可以直接使用“data”结果。我收到这些错误的实际原因是,我试图将包含无效字符的数据输入到该div中

为此,我在互联网上到处搜索,希望有人能找到这个问题并阅读以下代码:

JavaScript:

function displayrecordvalues(id) {
$.ajax({
    url: 'handler.php', 
    data: { o: 'displayrecord', id: id } ,
    type: "POST",
    dataType: 'json'
})
.success(
    function(formdata2){
        $("#studentphoto").prop("value", formdata2['studentphoto']); 
        $("#grade").val(formdata2['grade']); 
        $("#birthday").prop("value", formdata2['birthday']); 
        $("#gender").prop("checked", true);
        $("#fname").prop("value", formdata2['fname']); 
        $("#mname").prop("value", formdata2['mname']); 
        $("#lname").prop("value", formdata2['lname']); 
... etc...
    }
)
.fail(
    function(data){
        alert('error');
        console.log( "Data:", data);
    }
); 
}
PHP: ... 将SQL数据行放入名为$result的变量中,删除所有不需要的字符,然后只回显一行,这将是本例中的最后一行

// Intended for 1-row recordset
// Sanitize the data! (remember the '&' !)
$badchars = array("--", ";", );
foreach($result as &$v){
    $v = strip_tags($v);
    $v = htmlspecialchars($v); 
    $v = str_replace($badchars, "", $v);
}

echo json_encode($result);

完成了!魔法。

请让我们(a)查看您的代码,以及(b)更清楚地描述“不工作”。您能再次检查
$\u POST['id']
$output
的值吗?您得到了什么?什么是
var\u dump($result)
output?var\u dump不会输出,因为我是如何使用Ajax/$.post引入数据的。但是,在该功能中,我可以通过电子邮件向自己发送结果。数据看起来像数组一样有效。我确实在某些字段中看到“'”。当我使用$('#utilitydiv').html(数据)时,似乎不喜欢这个字符。。。然后我的下一个控制台错误是formdata未定义,这使我相信它会被完全转储。
function displayrecordvalues(id) {
$.ajax({
    url: 'handler.php', 
    data: { o: 'displayrecord', id: id } ,
    type: "POST",
    dataType: 'json'
})
.success(
    function(formdata2){
        $("#studentphoto").prop("value", formdata2['studentphoto']); 
        $("#grade").val(formdata2['grade']); 
        $("#birthday").prop("value", formdata2['birthday']); 
        $("#gender").prop("checked", true);
        $("#fname").prop("value", formdata2['fname']); 
        $("#mname").prop("value", formdata2['mname']); 
        $("#lname").prop("value", formdata2['lname']); 
... etc...
    }
)
.fail(
    function(data){
        alert('error');
        console.log( "Data:", data);
    }
); 
}
// Intended for 1-row recordset
// Sanitize the data! (remember the '&' !)
$badchars = array("--", ";", );
foreach($result as &$v){
    $v = strip_tags($v);
    $v = htmlspecialchars($v); 
    $v = str_replace($badchars, "", $v);
}

echo json_encode($result);