Я разработал игру с Javascript, и когда пользователь закончит ее, я должен сохранить его запись в базе данных. Здесь вы видите код:

$temp = $_POST['playername'];             //username
$text  = file_get_contents('names.txt');  //list with all usernames

//this text file contains the names of the players that sent a record.

$con=mysqli_connect("localhost","username","pass","my_mk7vrlist");

if (stripos(strtolower($text), strtolower($temp)) !== false) {
//if the username is in the list, don't create a new record but edit the correct one   

 mysqli_query($con, "UPDATE `my_mk7vrlist`.`mk7game` SET `record` = '".$_POST['dadate']."' WHERE `mk7game`.`playername` = ".$temp." LIMIT 1 ");

} else {

 //The username is not in the list, so this is a new user --> add him in the database
 mysqli_query($con, "INSERT INTO `mk7game` (`playername`,`record`,`country`,`timen`) VALUES ('".$_POST['playername']."', '".$_POST['dadate']."', '".$_POST['country']."', '".$_POST['time_e']."')");

 file_put_contents("names.txt",$text."\n".$temp);
 //update the list with this new name
}

//Close connection
mysqli_close($con);

Когда у меня появляется новый пользователь (часть в моем "else"), код работает правильно, потому что у меня есть новая строка в моей базе данных.

Если имя пользователя уже существует в списке, это означает, что этот игрок уже отправил свою запись, и поэтому я должен обновить таблицу. Кстати, я не могу редактировать запись на плеере, который уже послал запись.

mysqli_query($con, "UPDATE `my_mk7vrlist`.`mk7game` SET `record` = '".$_POST['dadate']."' WHERE `mk7game`.`playername` = ".$temp." LIMIT 1 ");

Похоже, это неправильно, и я не могу понять, почему. Я новичок в PHP и MySQL.

У вас есть какие-либо предложения?

0
Alberto Rossi 24 Фев 2014 в 21:17
3
Я собираюсь немного поплакать внутри. 1) Поместите имена в базу данных 2) Используйте заполнители 3) Обработайте ошибки.
 – 
user2864740
24 Фев 2014 в 21:19
1
Почему вы используете stripos, а затем strtolower, когда stripos не чувствителен к регистру? И поиск chuck также найдет chuckles
 – 
Class
24 Фев 2014 в 21:19
Создайте уникальный ключ для имени пользователя, затем используйте dev.mysql. com / doc / refman / 5.0 / en / insert-on-duplicate.html.
 – 
Sam
24 Фев 2014 в 21:20
1
Примечание: я так понимаю, вы тщательно спрятали свой файл .txt и защитили его с помощью .htaccess
 – 
Funk Forty Niner
24 Фев 2014 в 21:30
1
@ Fred-ii: Да, я это сделал, он защищен
 – 
Alberto Rossi
24 Фев 2014 в 21:31

2 ответа

Лучший ответ

В операторе UPDATE отсутствуют кавычки вокруг $temp:

mysqli_query($con, "UPDATE `my_mk7vrlist`.`mk7game` 
                    SET `record` = '".$_POST['dadate']."' 
                    WHERE `mk7game`.`playername` = '".$temp."' 
                                                   ^         ^
                    LIMIT 1 ") or die(mysqli_error($con));

Однако было бы лучше использовать подготовленные операторы с параметрами, а не вставлять строки в запрос.

3
Barmar 24 Фев 2014 в 21:23
Спасибо, не заметил :)
 – 
Alberto Rossi
24 Фев 2014 в 21:24
1
Вы также должны проверить наличие ошибок и сообщить сообщение об ошибке, которое могло помочь вам "заметить" ее.
 – 
Barmar
24 Фев 2014 в 21:25
Приму твой ответ, твое решение сработало. И еще одно: как вы думаете, я смогу как-нибудь улучшить if (stripos(strtolower($text), strtolower($temp)) !== false), если буду искать дубликаты в своей базе данных?
 – 
Alberto Rossi
24 Фев 2014 в 21:30
Почему вы используете файл, а не проверяете саму базу данных?
 – 
Barmar
24 Фев 2014 в 21:31
1
Обратите внимание на параметр ON DUPLICATE KEY UPDATE в операторе INSERT. Это позволяет сделать все в одном заявлении.
 – 
Barmar
24 Фев 2014 в 21:33

Избегайте ввода данных пользователем!
$temp = mysqli_real_escape_string($con, $_POST['playername']);

Обязательно прикрепите mysqli_connect () выше этого

$select = mysqli_query($con, "SELECT `id` FROM `mk7game` WHERE `playername` = '".$temp."'");
if(mysqli_num_rows($select))
    exit("A player with that name already exists");

Удалите это в перед запросом UPDATE, и все будет хорошо - очевидно, вам нужно будет отредактировать его, чтобы он соответствовал настройке вашей таблицы

1
Magictallguy 24 Фев 2014 в 21:22