【问题标题】:Problems using MERGE INTO statements in php for a MySQL database在 php 中为 MySQL 数据库使用 MERGE INTO 语句的问题
【发布时间】:2011-09-12 13:41:27
【问题描述】:

我正在尝试在我的 php 文件中使用 MERGE INTO 语句来更新或插入多人游戏的 MySQL 数据库。

以下是我想要完成的任务的完整描述:

在 javascript 文件中使用以下行调用 php 文件:

xmlhttp.open('GET', "phpsqlajax_genxml.php?" + "lat=" + lla[0] + "&heading=" + truckHeading + "&lng=" + lla[1] + "&velocity0=" + vel0 + "&velocity1=" + vel1 + "&velocity2=" + vel2 + "&id=" + playerNumber, true);

这将发送 php 文件信息以更新数据库。要么这是一个新玩家并且第一次发送此信息,这意味着将在数据库中创建一个新行,要么它将是一个只需要更新其信息的当前玩家。

如果是新玩家,发送的“id”将是数据库中尚不存在的“id”。

由于某种原因,数据库没有更新,也没有添加新行。我认为这是一个语法错误,因为我没有太多使用 MERGE 语句的经验。有这方面经验的人可以告诉我我可能做错了什么吗?

这是 MERGE INTO 语句之前的代码,以便您了解哪些变量是哪些:

 $id = $_GET['id'];

 $lat = $_GET['lat'];

 $lng = $_GET['lng'];

 $heading = $_GET['heading'];

 $velocity0 = $_GET['velocity0'];

 $velocity1 = $_GET['velocity1'];

 $velocity2 = $_GET['velocity2'];

id是列标题,$id是传入的id

这是我的 php 文件中当前的 MERGE INTO 语句:

  MERGE INTO markers USING id ON (id = $id)
  WHEN MATCHED THEN
  UPDATE SET lat = $lat, lng = $lng, heading = $heading, velocityX = $velocity0, velocityY = $velocity1, velocityZ = $velocity2
  WHEN NOT MATCHED THEN
  INSERT (id, name, address, lat, lng, type, heading, velocityX, velocityY, velocityZ)       VALUES ($id, 'bob', 'Poop Lane', $lat, $lng, 'Poop', $heading, $velocity0, $velocity1, $velocity2)

【问题讨论】:

    标签: php mysql database merge


    【解决方案1】:

    如果在调用过程中发生任何故障,PHP 的数据库库总是让它们的各种函数调用返回 FALSE。假设你在 mysql_/mysqli_ 上,那么你应该这样做:

    $sql = "MERGE INTO ....";
    $result = mysql_query($sql);
    if ($result === FALSE) {
        die(mysql_error());
    }
    

    不检查数据库调用的返回值是不好的做法。即使查询字符串在语法上 100% 有效,查询失败的方式也太多了。假设一切正常是让自己陷入非常糟糕的境地的最简单方法。同样,当事情确实失败时,缺乏错误处理只会隐藏错误的实际原因,然后你最终会得到这样的答案。

    哦,在我忘记之前... MySQL 不支持“MERGE INTO...”,因此您的整个查询是语法错误。考虑改用“REPLACE INTO...”或“INSERT ... ON DUPLICATE KEY UPDATE ...”。

    【讨论】:

    • 那么在这种情况下如果 $result = FALSE 会发生什么,我的游戏会不会运行并且会显示错误消息?我会在哪里看到错误消息。你可以在 thehobbit2movie.com 看看我的游戏
    • 取决于数据库调用应该做什么。未能获得高分是令人讨厌的,但不是致命的。在超过 4 小时的战斗后未能记录下您击败了 Boss X 可能会导致您的房子被怂恿/TP'd。错误处理取决于您,但盲目假设成功绝对不是正确的方法。
    猜你喜欢
    • 1970-01-01
    • 2016-11-30
    • 2013-01-23
    • 2023-03-05
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 2012-11-22
    • 2014-12-22
    相关资源
    最近更新 更多