【问题标题】:PHP code doesn't work anymore after SQL version update by my provider?我的提供商更新 SQL 版本后 PHP 代码不再工作?
【发布时间】:2015-01-12 11:25:12
【问题描述】:

我有一个 http-bridge 在 Second Life 应用程序和数据库之间交换信息。它工作正常,但最近在我的提供商将我的数据库的 SQL 版本更改为 5.5.38 后停止了。这是我的旧 php 脚本的示例:

<?php
$con=mysqli_connect("DB_HOSTNAME","DB_USERNAME","DB_PASSWORD", "DB_DATABASE");

if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$PKey = mysqli_real_escape_string($con, $_GET['playerKey']);
$HKey = mysqli_real_escape_string($con, $_GET['hudKey']);  

echo $HKey, " and " , $PKey;

$sql="INSERT INTO test (HKey, PKey)
VALUES ('$HKey', '$PKey')";

echo $sql . '<br/>'; 

if (!mysqli_query($con,$sql)) {
  die('Error: ' . mysqli_error($con));
}
echo "1 record added";

mysqli_close($con);
?> 

我收到以下错误消息:

错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在 '-get (HKey, PKey) VALUES ('XXXXXXX-fe56-XXXX-4bea-XXXXXXXXX', 'XXXXXX' at line 1

我曾尝试使用我在 Stack Overflow 上的一篇文章中找到的插入语句:

$stmt = $mysqli->prepare("INSERT INTO test (HKey, PKey) VALUES (?, ?)");
$stmt->bind_param("ss", $HKey, $PKey);
$stmt->execute();

但是当我插入那行代码时,它也不起作用,我根本没有收到任何错误消息。

【问题讨论】:

  • $P-Key$H-Key 不要使用连字符。 (H-Key, P-Key) 同样的事情。在列周围使用刻度线`。对于这两个实例,SQL 都将其解释为“H minus Key”等。这不是您的提供者,而是您的代码。
  • right syntax to use near '-get (HKey, PKey) 您发布的内容不会引发该错误。您为什么不重新开始并发布您真正使用的代码,以及表单以及您如何通过真实示例传递输入。我认为 真的 是,您的表名包含一个连字符,这又是我的原始评论。 SQL 认为你想做数学。
  • 我看不到你正在使用的代码,正如 Fred 所说的,我看不到它是如何工作的。它也应该在以前的 MySQL 服务器版本上被炸毁。就目前而言,这个问题将会结束,但至少这个教训是有价值的——展示真实的代码,而不是它的净化版本。
  • @halfer 我认为 OP 目前的沉默可以解释为:“哇哦,它有效,我玩得很开心!!” ;- )
  • OP,我已将您的更新移至答案(它覆盖了我对您的问题所做的一些改进编辑,因此无论如何它都需要回滚 - 请参阅编辑历史记录)。另外,哦,天哪!请不要在互联网上的任何地方完全输入大写字母——这通常被认为是大喊大叫。这不是 Stack Overflow 规则 - 这是过去 25 年左右的网络礼仪。

标签: php mysql sql-server sql-insert


【解决方案1】:

right syntax to use near '-get (HKey, PKey)

您发布的vvv不会抛出该错误。

INSERT INTO test (HKey, PKey)

“嗨 Fred,你真的很会猜。我的表名确实包含连字符。”

您的表名包含连字符。 (我没有猜到,错误告诉了我

我是怎么知道的?

  • 很清楚。您拥有 HKey 和 PKey 的列名,并在您发布的错误中的列名之前看到 -get

  • 语法:INSERT INTO table (column_1, column_2) VALUES ('value_1', 'value_2')

  • table = 你的 table-get,column_1 = 你的 HKey,column_2 = 你的 PKey

例如,如果您的表被称为“table-get”,那么 MySQL 会将其解释为“table minus get”。

您可以在表名周围使用反引号,或者使用下划线将其重命名为“table_get”。

即:

INSERT INTO `table-get` (HKey, PKey)

或不使用刻度对其重命名(如果它不包含空格或保留字)

INSERT INTO table_get (HKey, PKey)

阅读标识符限定符:

另外,正如 Halfer 在评论中所说:

“我看不到你正在使用的代码,正如 Fred 所说的,我看不出它是如何工作的。它应该在以前的 MySQL 服务器版本上也被炸毁了。” em>

  • 我也同意这一点。

发帖提示:

每当发布问题并且出于某种原因不想发布实际代码时,至少发布一个很好的表示。

例如:

INSERT INTO test-get (HKey, PKey)

至少每个人都可以通过伪代码判断错误可能在哪里。

  • 它让事情变得更清晰。

【讨论】:

    【解决方案2】:

    (代表 OP 发布答案)。

    好的,错误不在我的服务提供商一方,而是我使用了一个包含连字符的新表。这是我的第一篇文章,我犯了一个错误,因为没有发布 100% 的原始代码来混淆大家。我已经学会了我的教训,不会再这样做了。对所有觉得浪费时间的人深表歉意。无论如何,它帮助我解决了错误。

    【讨论】:

    • 你不能在重新发布之前把答案全大写吗...?
    • 嘿,你们对我来说太快了。我现在清理了它。 ;)
    • @Pienaar 你接受了错误的答案。看看我发的那个。
    • @Fred:我想我现在已经犯了每一个可能的错误......好吧,感谢指点我更正。
    • @Pienaar:没关系。虽然接受/勾选“社区 wiki”帖子是可以接受的,但这样做没有多大价值,因为没有人获得声誉积分。如果我代表其他人回答,我倾向于使用 CW,它对人们说“这不是我的帖子,无需勾选/投票”。这里有很多模因要学习,但坚持下去 - 你会掌握它的窍门!
    最近更新 更多