Проблемы с использованием операторов MERGE INTO в php для базы данных MySQL - PullRequest
1 голос
/ 10 июня 2011

Я пытаюсь использовать оператор MERGE INTO в своем php-файле для обновления или вставки в базу данных MySQL для многопользовательской игры.

Вот полное описание того, что я пытаюсь сделать:

Файл php вызывается со следующей строкой из файла javascript:

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

Это будет отправка информации о php-файле для обновления базы данных. Либо это будет новый игрок, и в первый раз эта информация будет отправлена, что означает, что будет создана новая строка в базе данных, либо это будет текущий игрок, которому просто нужно обновить свою информацию.

Если это новый игрок, то отправляемым идентификатором будет тот, которого еще нет в базе данных.

По какой-то причине база данных не обновляется и новые строки не добавляются. Я думаю, что это синтаксическая ошибка, потому что у меня нет большого опыта использования операторов 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 - это идентификатор, передаваемый в

Вот мой текущий оператор MERGE INTO в моем php-файле:

  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)

1 Ответ

4 голосов
/ 10 июня 2011

Библиотеки баз данных PHP неизменно имеют различные вызовы функций, возвращающие FALSE, если во время вызова произошел сбой.Предполагая, что вы используете mysql_ / mysqli_ , вы должны делать что-то вроде этого:

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

Плохая практика - НЕ проверять возвращаемые значения из вызовов базы данных.Даже если строка запроса синтаксически допустима на 100%, существует слишком много способов для сбоя запроса.Предполагая, что все работает, это самый простой способ попасть в очень плохую ситуацию.Кроме того, когда что-то не получается, отсутствие обработки ошибок просто скрывает фактическую причину ошибки, и тогда вы в конечном итоге получаете SO, получая такие ответы.

О, и прежде чем я забуду ... MySQLне поддерживает "MERGE INTO ...", поэтому весь ваш запрос является синтаксической ошибкой.Попробуйте использовать « REPLACE INTO ...» или «INSERT ... ON DUPLICATE KEY UPDATE ...».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...