【问题标题】:Error after migrating from Mysql to MariaDb从 Mysql 迁移到 MariaDb 后出错
【发布时间】:2020-06-13 11:42:15
【问题描述】:

我有一个奇怪的错误: 我有那个简单的代码:

$id = strip_tags($_SESSION["infos_profile_id"]);
$id_friend = strip_tags($_POST["update_user_chat_every_5_second"]);
$q = $bdd->query('SELECT * FROM message WHERE id_sender = '.$id_friend.' AND id_send_to = '.$id.' AND message_read = "0"');

在 mysql 上运行良好。

但是在 mariadb 服务器上托管我的网站后,它看到了那个错误。

PHP 致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在

我已经尽一切努力解决,但我找不到真正的错误来自哪里。

对解决该错误有什么帮助吗?

谢谢。

【问题讨论】:

  • 你不能混用不同的mysql api。
  • 警告:尽可能使用带有占位符值的预处理语句,以避免在查询中注入任意数据并创建SQL injection bugs。在mysqliPDO 中执行这些操作非常简单,其中任何用户提供的数据都使用?:name 指示符指定,稍后使用bind_paramexecute 填充,具体取决于您是哪个使用。
  • @Parfait PHP 世界充满了赤贫和苦难,考虑到有多少伟大的工具可以免费下载并且可以轻松下载,这是令人震惊的。这可能是因为这些伟大的工具被埋在无知的 YouTube“教程”和 w3schools 之类的垃圾填埋场之下。
  • @tadman 我听不懂你的英语。所以谢谢你们的cmets。
  • 每当您遇到这样的错误时,记录实际生成的 SQL 以查看您发送到数据库的内容然后对其进行检查是很有用的。除此之外,您不能通过使用从表单发布的变量来简单地创建 SQL,而不确保它们不安全,通过使用参数和绑定值与提供的函数/方法或确保使用提供的 mysqli_real_escape_string 函数或类似函数解析输入值一种防止 SQL 注入。

标签: php mysql mariadb syntax-error


【解决方案1】:

我同意上面@MaxT 的评论——在将所有变量插入到 SQL 查询中后,您应该回显您的 SQL 查询。当您查看格式化 SQL 查询的代码而不是查询本身时,调试起来太困难了。

strip_tags() 对 SQL 注入保护没有用的评论也是正确的。

查询参数是防止 SQL 注入的最佳保护,它们也可以帮助您避免语法错误。

您的代码如下所示:

$id = $_SESSION["infos_profile_id"];
$id_friend = $_POST["update_user_chat_every_5_second"];
$sql = 'SELECT * FROM message WHERE id_sender = :id_friend AND id_send_to = :id AND message_read = 0';
$q = $bdd->prepare($sql);
$q->execute( ['id'=>$id, 'id_friend'=>$id_friend] );

真的很简单!

【讨论】:

  • 在我所有的项目中,我有 604 个未准备好的查询。那么我是否必须更改所有这些 604 查询?哦,我的头,请告诉我我不必这样做。
  • 您不必更改查询,除非它插入 PHP 变量。如果查询只是一个没有变量的纯字符串,则无需更改它。您应该检查每个查询以确保其安全,但您可能只需要更改其中的一部分。
  • 这样想:假设您是一名电工,您的主管发现您安装 604 个接线盒的方式可能会导致房屋起火。如果您抱怨“我必须修复所有 604 个问题吗?请告诉我我不必这样做”,那么您就没有像专业人士那样承担安全责任。如果你的主管因为你的评论解雇了你,我不会感到惊讶。
  • SQL 注入是一个严重的漏洞,它经常导致数据泄露。阅读codecurmudgeon.com/wp/sql-injection-hall-of-shame,一位博主收集了有关 SQL 注入案例的新闻报道。
猜你喜欢
  • 2011-11-25
  • 2019-02-15
  • 2019-09-10
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 2018-07-03
相关资源
最近更新 更多