PHP MySQL запрос сбой в некоторых случаях?

У меня есть PHP-скрипт, который получает почтовые запросы для ввода клиентов в базу данных, он работает большую часть времени, но в некоторых случаях он не работает, если у клиента есть специальные символы в его имени. Что делает его еще более странным, если я пытаюсь запустить запрос вручную в PHPMyAdmin работает нормально, код php я использую здесь:

$mysql = new mysqli("***", "****", "****", "****");
mysqli_set_charset($mysql,"utf8mb4");

if (isset($_POST["name"])) {
$name = $mysql->real_escape_string($_POST["name"]);
} else {
mysqli_close($mysql);
die("Name not set");
}

$query = sprintf ("INSERT INTO `que` (`name`, `ip`, `steamid`, `serverip`) VALUES ('%s', '%s', '%s', '%s')", $name, $clientip, $steamid, $serverip.":".$serverport);

if(!$mysql->query($query)) {
mysqli_close($mysql);
die("Query Failure: " . $query);
}

Как уже говорилось, приведенный выше код работает в 90% случаев, но в некоторых случаях (я полагаю, что это вызвано специальными символами в имени), он потерпит неудачу.

Вот несколько случаев отказа:

INSERT INTO `que` (`name`, `ip`, `steamid`, `serverip`) VALUES ('Shrimp%20ᴳᵀ%20ƒ„%20s%20%20t', '****', 'STEAM_1:0:16045698', '178.32.48.195:27015')
INSERT INTO `que` (`name`, `ip`, `steamid`, `serverip`) VALUES ('★★%20—%20noichia%20—%20…★', '****', 'STEAM_1:0:103227484', '178.32.48.195:27015')
INSERT INTO `que` (`name`, `ip`, `steamid`, `serverip`) VALUES ('•%20rie%20Low%20¼rke%20¢%20Ù„', '*****', 'STEAM_1:1:60346821', '178.32.48.195:27015')

Все входы сообщений очищаются следующим образом (не то, что кто-то может публиковать плохие сообщения, так как только мои серверы могут отправлять сообщения):

$mysql->real_escape_string

Есть ли что-то, что я делаю не так?

Любая помощь высоко ценится!

Изменить: я также URL-кодировать перед отправкой запроса в PHP, используя следующие:

stock void URLEncode(char[] str, int len)
{
char[] str2 = new char[len * 3 + 1];
Format(str2, len * 3 + 1, "%s", str);

char ReplaceThis[20][] =  { "%", " ", "!", "*", "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "#", "[", "]" };
char ReplaceWith[20][] =  { "%25", "%20", "%21", "%2A", "%27", "%28", "%29", "%3B", "%3A", "%40", "%26", "%3D", "%2B", "%24", "%2C", "%2F", "%3F", "%23", "%5B", "%5D" };

for (int x = 0; x < 20; x++) {
ReplaceString(str2, len, ReplaceThis[x], ReplaceWith[x]);
}

if (strlen(str2) > len * 3) {
LogError("statistics encode url exceeded length (%d): %s", len * 3, str2);
}

Format(str, len, "%s", str2);

if (strlen(str) > len - 1) {
LogError("statistics encode url exceeded length (%d): %s", len, str);
}
}

1

Решение

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

Вот как ваш код может быть изменен.

$mysql = new mysqli("***", "****", "****", "****");
mysqli_set_charset($mysql,"utf8mb4");

if (isset($_POST["name"])) {

$query = $mysql->prepare("INSERT INTO `que` (`name`, `ip`, `steamid`, `serverip`) VALUES (?, ?, ?, ?)")
$query->bind_param("ssss", $name, $clientip, $steamid, $serverip.":".$serverport);

if($query->execute()) {
print 'ok';
}

} else {

print 'Sorry required data not found';
}

Также стоит отметить, что вам не нужно явно закрывать соединение.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]