PDA

Просмотр полной версии : [Прочее] Проблема с сохранением данных в базу данных.



tikwqq
06.05.2023, 21:44
В общем и целом, для начала у меня криво сохраняло код безопасности, ну я первым делом решил переписать запрос на сохранение, в принципе, теперь все сохраняется, но в смещенном варианте. Подозреваю, что я как-то криво вписал все данные в запрос, но вроде проверил и должно быть нормально.
Буду рад помощи с кодом.
Запрос:

// SAVE DATA MYSQL
static const fmt_query[] = "INSERT INTO `accounts` (`pName`, `pPassport`, `pPassword`, `pMail`, `pSex`, `pSkin`, `pCode`, `pReg_data`, `pReg_ip`, `pAdmin`, `pACode`, `pMoney`) VALUES ('%s', '%s', '%s', '%s', '%d', '%d', '%d', '%s', '%s', '%d', '%d','%d')";
new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)+(-2+32)+(-2+64)+(-2+1)+(-2+3)+(-2+5)+(-2+12)+(-2+15)];
format(query, sizeof(query), fmt_query, playerid, pInfo[playerid][pName], pInfo[playerid][pPassport], pInfo[playerid][pPassword], pInfo[playerid][pMail], pInfo[playerid][pSex], pInfo[playerid][pSkin], pInfo[playerid][pCode], regdata, regip , pInfo[playerid][pAdmin], pInfo[playerid][pACode], pInfo[playerid][pMoney]);
mysql_query(tikwqq, query); // ,
Если данный код ничем не может помочь, дайте знать, где еще может быть информация и я вам ее предоставлю. :dirol:

Shaolinka
06.05.2023, 23:55
Есть несколько факторов, влияющих на твою проблему:
1. Отсутствие памяти, выделяемой под запрос. Хоть сама методика является неплохой и создана для ленивых, любящих возлагать подсчёт размера массива на плечи компилятора, она, как и обычное выделение памяти, должно быть соответствующим, с учётом максимальной длины всех имеющихся спецификаторов. Поэтому, определённо стоило бы отдебажить массив query, посмотрев какова там ситуация по итогу.
2. Отсутствие третьего параметра в mysql_query. mysql_query отправляет поточный запрос, ожидая ответа от него, потому в данном случае, как и в многих других, целесообразным решением будет использование многопоточной вариации: mysql_tquery, обрабатывающей код из запроса в ином потоке, не мешая работоспобности основного - то бишь сервера. Поэтому, в твоём случае третьим параметром должен быть false, дабы функция отправила не кешированный запрос(SELECT).

Это основные из факторов. Также хотелось бы посоветовать использовать экранирование, если речь о не хешированных паролях, ибо вполне себе могут передать SQL код. Ну и айпишник приличия ради как int хранить можно было, дабы не выделять лишних 16 ячеек в стек. Ну и, само по себе сравнение целых чисел должно быть быстрее сравнение строки.