在sql中插入数据时遇到一些问题,有些文本带有倒逗号,例如text的[duplicate]

Facing some issues to inserting data in sql, Some text is with inverted commas like text's [duplicate]

提问人:Amir 提问时间:11/3/2023 最后编辑:ADysonAmir 更新时间:11/3/2023 访问量:63

问:

这是我的 JSON 数组,我正在尝试使用此代码创建一个 JSON 数组,然后在我的 sql 中插入数据,但它不适用于倒逗号,例如“文本带有倒逗号”,如果当我插入相同的文本而没有 's 时,它会正常工作。

$custom_data = array();
$custom_data['seo_options'] = array("meta-title" => "The text is with inverted comma's", "meta-description" => "some data here", "meta-keywords" => "");

$sql2 = "INSERT INTO posts_meta (post_id,meta_key,meta_value) VALUES ('".$post_id."', 'custom_data', '".json_encode($custom_data)."')";
mysqli_query($conn2,$sql2);
php sql mysqli

评论

0赞 ADyson 11/3/2023
请阅读 如何在MySQL语句中包含PHP变量 。这既可以修复语法错误,也可以消除 SQL 注入攻击的任何漏洞。不确定您从哪里学会了构建查询,如上所示,但没有人应该再教授这种方法了。
0赞 Amir 11/3/2023
谢谢,但我发现了错误,我认为这是SQL问题 错误描述:您的SQL语法中有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在 '\'296\', \'custom_data\', \'{\“seo_options\”:{\“meta-title\”:\“你好,我是她......'在 1 号线
0赞 ADyson 11/3/2023
是的,但 SQL 问题几乎可以肯定是由于您没有在 PHP 中参数化查询引起的,因为数据库将它视为实际的 SQL 代码,而不是插入文本值的一部分。因此,它会提前终止你的custom_data值,然后之后的其余内容看起来也不像 SQL 代码(因为它实际上是你的数据的其余部分),所以 SQL 崩溃,因为它认为你输入了垃圾。如果正确参数化查询,则数据库将正确地将所有 JSON 视为文本,并且不会遇到此问题。'
0赞 ADyson 11/3/2023
坦率地说,在 2023 年,我感到震惊的是,人们被教导 PHP,却没有被告知如何正确构建他们的查询。那里一定有一些可怕的、过时的教材(和老师)。
0赞 ADyson 11/3/2023
看看你的PHP代码实际生成的SQL:。因此,MySQL接收到它,将自定义数据字段开头的视为字符串的开头,然后继续直到找到下一个,并认为这是字符串的末尾。INSERT INTO posts_meta (post_id,meta_key,meta_value) VALUES ('1', 'custom_data', '{"seo_options":{"meta-title":"The text is with inverted comma's","meta-description":"some data here","meta-keywords":""}}')''

答:

-1赞 PumpKing 11/3/2023 #1

首先,您应该写下您遇到的问题类型(例如,如果有错误消息)。

但是,问题可能出在破坏查询的 ' 符号上。在执行查询之前尝试转义它(添加斜杠应该可以正常工作)并检查它是否有效。

例如:

$custom_data['seo_options']['meta-title'] = addslashes($custom_data['seo_options']['meta-title']);

评论

0赞 Amir 11/3/2023
它添加了双斜杠“你好,我在这里\\'s”
0赞 Amir 11/3/2023
错误描述:您的 SQL 语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在 '\'296\', \'custom_data\', \'{\“seo_options\”:{\“meta-title\”:\“你好,我是她......'在 1 号线
0赞 ADyson 11/3/2023
@PumpKing 正确的诊断,但完全错误的(1990 年代)解决方案。阅读如何在 MySQL 语句中包含 PHP 变量以及 OP
0赞 PumpKing 11/5/2023
我没有提出真正的解决方案,因为我没有确切的问题。我注意到你喜欢写 1990 年代的文章,但在提出最先进的答案之前,我们应该问问自己是否应该理解这种答案。在这种情况下,正如你所经历的,事实并非如此。所以,是的,最先进的答案是完全正确的,但在这种情况下它是无用的。
0赞 ADyson 11/5/2023
@PumpKing 1) 是问题的充分线索。OP后来也把实际的错误放在了评论中。2) ...是的,因为这正是您的建议的来源,并且早已被证明不能正确解决问题。3)准备好的陈述不是“最先进的”。在过去的 20 年里,它们一直是构建查询和避免语法和注入问题的标准、经过验证的正常方法。它没有什么聪明的,也没有什么是初学者无法掌握的——如果教过它,他们通常会这样做。it is not working with inverted commawriting about 1990s
-2赞 nemesiscb 11/3/2023 #2

尝试使用添加斜杠,如下所示:

mysqli_query($conn2,addslashes($sql2));

或者仅在 json/array 的部件上。 但我建议你选择准备好的声明。

评论

0赞 Amir 11/3/2023
你能给我看准备好的声明吗?
0赞 Amir 11/3/2023
它不起作用 mysqli_query($conn 2,Addslashes($sql 2));
0赞 CBroe 11/3/2023
@Amir我们在这里不是为了向每个找到这个网站的新初学者传授基础知识。准备好的发言有据可查,并且已经进行了非常详细的讨论 - 所以请去通知自己!
0赞 Amir 11/3/2023
好的,现在检查谢谢。
0赞 ADyson 11/3/2023
我们@nemesiscb回到了 1990 年代??如果你知道准备好的陈述,你到底为什么要建议这种胡说八道?
-1赞 Amir 11/3/2023 #3

错误描述:您的 SQL 语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解要使用的正确语法。

这是我刚刚升级MariaDB版本的唯一问题,问题解决了。

感谢大家的支持。

评论

0赞 ADyson 11/3/2023
我看不出任何可以通过升级mariaDB来治愈这个问题的可能性,这肯定只是一个巧合。你有什么版本?您升级到哪个版本?现在有没有一个版本可以神奇地修复查询中的引号?