[jTuT] MySQL R41-4 (Installation, XAMPP, Verwendung, Bedienung & Registrations-System)

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Es gibt Neuigkeiten! Ab sofort könnt ihr dem Donators Club auf Lebenszeit beitreten.
    Weitere Infos im Thema Donator's Club ab heute wieder verfügbar!

    • Das kann man auch mit dem gespeicherten Cache machen, wie es in dem anderen Tutorial beschrieben ist. Von der Performance her wäre das was die Abfrage an die Datenbank angeht besser, da nur eine anstatt zwei gemacht wird, dafür muss der Cache gespeichert und geladen werden. Bei einer einzelnen Abfrage macht das keinen merklichen Unterschied.

      Beide Varianten kannst du ohne Bedenken nutzen.
    • Moin!

      Bei mir kommen folgende Errors:

      [17:38:12] [WARNING] CMySQLHandle::Create - connection already exists
      [17:38:12] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'root'@'localhost' (using password: YES)
      [17:38:12] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'root'@'localhost' (using password: YES)
      [17:38:12] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'root'@'localhost' (using password: YES)
      [17:38:12] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'root'@'localhost' (using password: YES)
      [17:38:12] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'root'@'localhost' (using password: YES)
      [17:38:12] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'root'@'localhost' (using password: YES)
      [17:38:12] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'root'@'localhost' (using password: YES)
    • iTsRooT schrieb:

      Hab ein problem.
      Hast du die Dateien alle in den richtigen Ordnern?
      Versuche es ansonsten auch mal mit:

      PAWN-Quellcode

      1. mysql_log(NONE);



      Nutze schrieb:

      [17:38:12] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'root'@'localhost' (using password: YES)
      Der root Benutzer hat im Standard kein Passwort. Versuche es ohne Angabe eines Passworts.
    • Jeffry schrieb:

      iTsRooT schrieb:

      Hab ein problem.
      Hast du die Dateien alle in den richtigen Ordnern?Versuche es ansonsten auch mal mit:

      PAWN-Quellcode

      1. mysql_log(NONE);



      Nutze schrieb:

      [17:38:12] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'root'@'localhost' (using password: YES)
      Der root Benutzer hat im Standard kein Passwort. Versuche es ohne Angabe eines Passworts.
      hat sich schon erledigt ging von selbst

      Beitrag von dsfdf34as ()

      Dieser Beitrag wurde von seegras gelöscht ().
    • Jeffry schrieb:

      iTsRooT schrieb:

      Hab ein problem.
      Hast du die Dateien alle in den richtigen Ordnern?Versuche es ansonsten auch mal mit:

      PAWN-Quellcode

      1. mysql_log(NONE);



      Nutze schrieb:

      [17:38:12] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'root'@'localhost' (using password: YES)
      Der root Benutzer hat im Standard kein Passwort. Versuche es ohne Angabe eines Passworts.
      Hilft leider nicht :(
    • Hey,

      ich habe alle Schritte befolgt, jedoch erscheint kein Dialog wenn ich connecte.

      Code

      PAWN-Quellcode: Gamemode

      1. #include <a_samp>
      2. #include <a_mysql>
      3. #define MYSQL_HOST "***.***.***.***" //IP Adresse des MySQL Servers
      4. #define MYSQL_USER "***" //Benutzername der angemeldet wird
      5. #define MYSQL_PASS "***" //Passwort des Benutzers
      6. #define MYSQL_DBSE "***" //Name der Datenbank
      7. //Dialog IDs
      8. #define DIALOG_REGISTER 0
      9. #define DIALOG_LOGIN 1
      10. new MySQL:handle;
      11. enum pDataEnum
      12. {
      13. p_id,
      14. bool:pLoggedIn,
      15. pName[MAX_PLAYER_NAME],
      16. pLevel,
      17. pMoney,
      18. pKills,
      19. pDeaths
      20. }
      21. new PlayerInfo[MAX_PLAYERS][pDataEnum];
      22. //Forwards
      23. forward OnUserCheck(playerid);
      24. forward OnUserRegister(playerid);
      25. forward OnUserLogin(playerid);
      26. main()
      27. {
      28. print("\n----------------------------------");
      29. print(" Blank Gamemode by your name here");
      30. print("----------------------------------\n");
      31. }
      32. public OnGameModeInit()
      33. {
      34. MySQL_SetupConnection();
      35. SetGameModeText("Blank Script");
      36. AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
      37. return 1;
      38. }
      39. public OnGameModeExit()
      40. {
      41. mysql_close(handle);
      42. return 1;
      43. }
      44. public OnPlayerRequestClass(playerid, classid)
      45. {
      46. SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
      47. SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
      48. SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
      49. //Wenn der Spieler die Class-Selection betritt prüfe, ob er bereits eingeloggt ist
      50. if(!PlayerInfo[playerid][pLoggedIn])
      51. {
      52. //Wenn nicht, dann prüfe ob der Spieler ein Konto hat
      53. //Dazu wird ein Query gesendet und ein neues Callback aufgerufen
      54. //%e steht für einen geprüften String (sollte anstatt %s in Queries verwendet werden)
      55. new query[128];
      56. mysql_format(handle, query, sizeof(query), "SELECT id FROM users WHERE name = '%e'", PlayerInfo[playerid][pName]);
      57. //Das Query wird abgesendet und die playerid an OnUserCheck übergeben
      58. mysql_pquery(handle, query, "OnUserCheck", "d", playerid);
      59. }
      60. return 1;
      61. }
      62. public OnPlayerConnect(playerid)
      63. {
      64. PlayerInfo[playerid][p_id] = 0;
      65. PlayerInfo[playerid][pLoggedIn] = false;
      66. PlayerInfo[playerid][pLevel] = 0;
      67. PlayerInfo[playerid][pMoney] = 0;
      68. PlayerInfo[playerid][pKills] = 0;
      69. PlayerInfo[playerid][pDeaths] = 0;
      70. GetPlayerName(playerid, PlayerInfo[playerid][pName], MAX_PLAYER_NAME);
      71. return 1;
      72. }
      73. public OnPlayerDisconnect(playerid, reason)
      74. {
      75. SaveUserStats(playerid);
      76. return 1;
      77. }
      78. public OnPlayerSpawn(playerid)
      79. {
      80. return 1;
      81. }
      82. public OnPlayerDeath(playerid, killerid, reason)
      83. {
      84. if(killerid != INVALID_PLAYER_ID)
      85. {
      86. PlayerInfo[killerid][pKills]++;
      87. GivePlayerMoney(killerid, 10);
      88. PlayerInfo[killerid][pMoney] += 10;
      89. if(PlayerInfo[killerid][pKills] > 3)
      90. {
      91. PlayerInfo[killerid][pLevel] = 1;
      92. }
      93. }
      94. PlayerInfo[playerid][pDeaths]++;
      95. return 1;
      96. }
      97. public OnVehicleSpawn(vehicleid)
      98. {
      99. return 1;
      100. }
      101. public OnVehicleDeath(vehicleid, killerid)
      102. {
      103. return 1;
      104. }
      105. public OnPlayerText(playerid, text[])
      106. {
      107. return 1;
      108. }
      109. public OnPlayerCommandText(playerid, cmdtext[])
      110. {
      111. if (strcmp("/mycommand", cmdtext, true, 10) == 0)
      112. {
      113. // Do something here
      114. return 1;
      115. }
      116. return 0;
      117. }
      118. public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
      119. {
      120. return 1;
      121. }
      122. public OnPlayerExitVehicle(playerid, vehicleid)
      123. {
      124. return 1;
      125. }
      126. public OnPlayerStateChange(playerid, newstate, oldstate)
      127. {
      128. return 1;
      129. }
      130. public OnPlayerEnterCheckpoint(playerid)
      131. {
      132. return 1;
      133. }
      134. public OnPlayerLeaveCheckpoint(playerid)
      135. {
      136. return 1;
      137. }
      138. public OnPlayerEnterRaceCheckpoint(playerid)
      139. {
      140. return 1;
      141. }
      142. public OnPlayerLeaveRaceCheckpoint(playerid)
      143. {
      144. return 1;
      145. }
      146. public OnRconCommand(cmd[])
      147. {
      148. return 1;
      149. }
      150. public OnPlayerRequestSpawn(playerid)
      151. {
      152. return 1;
      153. }
      154. public OnObjectMoved(objectid)
      155. {
      156. return 1;
      157. }
      158. public OnPlayerObjectMoved(playerid, objectid)
      159. {
      160. return 1;
      161. }
      162. public OnPlayerPickUpPickup(playerid, pickupid)
      163. {
      164. return 1;
      165. }
      166. public OnVehicleMod(playerid, vehicleid, componentid)
      167. {
      168. return 1;
      169. }
      170. public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
      171. {
      172. return 1;
      173. }
      174. public OnVehicleRespray(playerid, vehicleid, color1, color2)
      175. {
      176. return 1;
      177. }
      178. public OnPlayerSelectedMenuRow(playerid, row)
      179. {
      180. return 1;
      181. }
      182. public OnPlayerExitedMenu(playerid)
      183. {
      184. return 1;
      185. }
      186. public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
      187. {
      188. return 1;
      189. }
      190. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
      191. {
      192. return 1;
      193. }
      194. public OnRconLoginAttempt(ip[], password[], success)
      195. {
      196. return 1;
      197. }
      198. public OnPlayerUpdate(playerid)
      199. {
      200. return 1;
      201. }
      202. public OnPlayerStreamIn(playerid, forplayerid)
      203. {
      204. return 1;
      205. }
      206. public OnPlayerStreamOut(playerid, forplayerid)
      207. {
      208. return 1;
      209. }
      210. public OnVehicleStreamIn(vehicleid, forplayerid)
      211. {
      212. return 1;
      213. }
      214. public OnVehicleStreamOut(vehicleid, forplayerid)
      215. {
      216. return 1;
      217. }
      218. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
      219. {
      220. if(dialogid == DIALOG_REGISTER)
      221. {
      222. //Spieler hat Abbrechen gewählt
      223. if(!response) return Kick(playerid);
      224. //Wenn der Spieler kein, oder ein zu kurzes, Passwort eingegeben hat
      225. if(strlen(inputtext) < 3) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registration", "Bitte registriere Dich:\n{FF0000}Mindestens 3 Zeichen!", "Ok", "Abbrechen");
      226. //Wenn alles passt wird der Spieler in der Datenbank angelegt
      227. //Als Verschlüsselung für das Passwort wird MD5 verwendet
      228. new query[256];
      229. mysql_format(handle, query, sizeof(query), "INSERT INTO users (name, password) VALUES ('%e', MD5('%e'))", PlayerInfo[playerid][pName], inputtext);
      230. //Das Query wird abgesendet und die playerid an OnUserRegister übergeben
      231. mysql_pquery(handle, query, "OnUserRegister", "d", playerid);
      232. return 1;
      233. }
      234. if(dialogid == DIALOG_LOGIN)
      235. {
      236. //Spieler hat Abbrechen gewählt
      237. if(!response) return Kick(playerid);
      238. //Wenn der Spieler kein, oder ein zu kurzes, Passwort eingegeben hat
      239. if(strlen(inputtext) < 3) return ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmeldung", "Bitte logge Dich ein:\n{FF0000}Mindestens 3 Zeichen!", "Ok", "Abbrechen");
      240. //Wenn alles passt wird die Datenbank ausgelesen
      241. new query[256];
      242. mysql_format(handle, query, sizeof(query), "SELECT * FROM users WHERE name = '%e' AND password = MD5('%e')", PlayerInfo[playerid][pName], inputtext);
      243. //Das Query wird abgesendet und die playerid an OnUserLogin übergeben
      244. mysql_pquery(handle, query, "OnUserLogin", "d", playerid);
      245. return 1;
      246. }
      247. return 1;
      248. }
      249. public OnPlayerClickPlayer(playerid, clickedplayerid, source)
      250. {
      251. return 1;
      252. }
      253. public OnUserRegister(playerid)
      254. {
      255. //Der Spieler wurde in die Datenbank eingetragen, es wird die id ausgelesen
      256. PlayerInfo[playerid][p_id] = cache_insert_id();
      257. PlayerInfo[playerid][pLoggedIn] = true;
      258. SendClientMessage(playerid, 0x00FF00FF, "[Konto] Registration erfolgreich.");
      259. return 1;
      260. }
      261. public OnUserCheck(playerid)
      262. {
      263. //Query wurde ausgeführt und das Ergebnis im Cache gespeichert
      264. new rows;
      265. cache_get_row_count(rows);
      266. if(rows == 0)
      267. {
      268. //Der Spieler konnte nicht gefunden werden, er muss sich registrieren
      269. ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registration", "Bitte registriere Dich:", "Ok", "Abbrechen");
      270. }
      271. else
      272. {
      273. //Es existiert ein Ergebnis, das heißt der Spieler ist registriert und muss sich einloggen
      274. ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmeldung", "Bitte logge Dich ein:", "Ok", "Abbrechen");
      275. }
      276. return 1;
      277. }
      278. public OnUserLogin(playerid)
      279. {
      280. //Query wurde ausgeführt und das Ergebnis im Cache gespeichert
      281. new rows;
      282. cache_get_row_count(rows);
      283. if(rows == 0)
      284. {
      285. //Der Spieler hat ein falsches Passwort eingegeben
      286. ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmeldung", "Bitte logge Dich ein:\n{FF0000}Falsches Passwort!", "Ok", "Abbrechen");
      287. }
      288. else
      289. {
      290. //Es existiert ein Ergebnis, das heißt der Spieler hat das richtige Passwort eingegeben
      291. //Wir lesen nun die erste Zeile des Caches aus (ID 0)
      292. cache_get_value_name_int(0, "id", PlayerInfo[playerid][p_id]);
      293. cache_get_value_name_int(0, "level", PlayerInfo[playerid][pLevel]);
      294. cache_get_value_name_int(0, "money", PlayerInfo[playerid][pMoney]);
      295. cache_get_value_name_int(0, "kills", PlayerInfo[playerid][pKills]);
      296. cache_get_value_name_int(0, "deaths", PlayerInfo[playerid][pDeaths]);
      297. PlayerInfo[playerid][pLoggedIn] = true;
      298. SendClientMessage(playerid, 0x00FF00FF, "[Konto] Eingeloggt.");
      299. GivePlayerMoney(playerid, PlayerInfo[playerid][pMoney]);
      300. }
      301. return 1;
      302. }
      303. //Stocks
      304. stock MySQL_SetupConnection(ttl = 3)
      305. {
      306. print("[MySQL] Verbindungsaufbau...");
      307. //mysql_log(); //<- Kommentar vor mysql_log entfernen um den MySQL Debug-Modus zu aktivieren
      308. handle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DBSE);
      309. //Prüfen und gegebenenfalls wiederholen
      310. if(mysql_errno(handle) != 0)
      311. {
      312. //Fehler im Verbindungsaufbau, prüfe ob ein weiterer Versuch gestartet werden soll
      313. if(ttl > 1)
      314. {
      315. //Versuche erneut eine Verbindung aufzubauen
      316. print("[MySQL] Es konnte keine Verbindung zur Datenbank hergestellt werden.");
      317. printf("[MySQL] Starte neuen Verbindungsversuch (TTL: %d).", ttl-1);
      318. return MySQL_SetupConnection(ttl-1);
      319. }
      320. else
      321. {
      322. //Abbrechen und Server schließen
      323. print("[MySQL] Es konnte keine Verbindung zur Datenbank hergestellt werden.");
      324. print("[MySQL] Bitte prüfen Sie die Verbindungsdaten.");
      325. print("[MySQL] Der Server wird heruntergefahren.");
      326. return SendRconCommand("exit");
      327. }
      328. }
      329. printf("[MySQL] Die Verbindung zur Datenbank wurde erfolgreich hergestellt! Handle: %d", _:handle);
      330. return 1;
      331. }
      332. stock SaveUserStats(playerid)
      333. {
      334. //Wenn der Spieler nicht eingeloggt ist, dann speichere seine Statistiken nicht
      335. if(!PlayerInfo[playerid][pLoggedIn]) return 1;
      336. //Ansonsten speichere sie
      337. new query[256];
      338. mysql_format(handle, query, sizeof(query), "UPDATE users SET level = '%d', money = '%d', kills = '%d', deaths = '%d' WHERE id = '%d'",
      339. PlayerInfo[playerid][pLevel], PlayerInfo[playerid][pMoney], PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths], PlayerInfo[playerid][p_id]);
      340. //Das Query wird abgesendet
      341. mysql_pquery(handle, query);
      342. return 1;
      343. }
      Alles anzeigen

    • Guten Abend,
      ich habe das Tutorial für mein Übungsscript genutzt um mich wieder in Pawn reinzufuchsen & MySQL zu lernen.

      Jetzt stehe ich allerdings vor folgendem Problem und zwar werden alle Werte wie Geld, Kills etc. nach jedem ausloggen auf 0 gesetzt & dementsprechend mit 0 wieder geladen beim Connecten.
      Bin ich der einzige, der das Problem hat ?

      Mit freundlichen Grüßen,
    • CyberFish schrieb:

      Guten Abend,
      ich habe das Tutorial für mein Übungsscript genutzt um mich wieder in Pawn reinzufuchsen & MySQL zu lernen.

      Jetzt stehe ich allerdings vor folgendem Problem und zwar werden alle Werte wie Geld, Kills etc. nach jedem ausloggen auf 0 gesetzt & dementsprechend mit 0 wieder geladen beim Connecten.
      Bin ich der einzige, der das Problem hat ?

      Mit freundlichen Grüßen,
      Laut Tutorial wir bei jedem einloggen alles auf 0 gesetzt und bei ausloggen wird alles gespeichert
    • CyberFish schrieb:

      Jetzt stehe ich allerdings vor folgendem Problem und zwar werden alle Werte wie Geld, Kills etc. nach jedem ausloggen auf 0 gesetzt & dementsprechend mit 0 wieder geladen beim Connecten.
      Nach dem Login sollten die Daten wieder geladen werden, vor dem Login steht natürlich alles auf 0.
      Wenn du kein serverside-Money hast, dann kannst du auch bei SaveUserStats das PlayerInfo[playerid][pMoney] durch ein GetPlayerMoney(playerid) ersetzen, dann sollte das Standardgeld gespeichert und geladen werden.


      iTsRooT schrieb:

      Laut Tutorial wir bei jedem einloggen alles auf 0 gesetzt
      Das stimmt nicht. Die Daten werden nach dem Login unter OnUserLogin aus der Datenbank geladen.
    • Jeffry schrieb:

      Das stimmt nicht. Die Daten werden nach dem Login unter OnUserLogin aus der Datenbank geladen.
      nein ich meinte vlt hat er das hier unter OnPlayerDisconnect:

      PAWN-Quellcode

      1. [list=1][*] PlayerInfo[playerid][p_id] = 0;
      2. [*] PlayerInfo[playerid][pLoggedIn] = false;
      3. [*] PlayerInfo[playerid][pLevel] = 0;
      4. [*] PlayerInfo[playerid][pMoney] = 0;
      5. [*] PlayerInfo[playerid][pKills] = 0;
      6. [*] PlayerInfo[playerid][pDeaths] = 0;
      7. [*] GetPlayerName(playerid, PlayerInfo[playerid][pName], MAX_PLAYER_NAME);
      8. [/list]
    • Trenne das mysql_format wie folgt:

      PAWN-Quellcode

      1. mysql_format(handle, query, sizeof(query), "UPDATE users SET level = '%d',", PlayerInfo[playerid][pLevel]);
      2. mysql_format(handle, query, sizeof(query), "%s money = '%d', kills = '%d',", query, PlayerInfo[playerid][pMoney], PlayerInfo[playerid][pKills]);
      3. //...
      4. mysql_format(handle, query, sizeof(query), "%s deaths = '%d' WHERE id = '%d'", query, PlayerInfo[playerid][pDeaths], PlayerInfo[playerid][p_id]);
    • Jeffry schrieb:

      Trenne das mysql_format wie folgt:

      PAWN-Quellcode

      1. mysql_format(handle, query, sizeof(query), "UPDATE users SET level = '%d',", PlayerInfo[playerid][pLevel]);mysql_format(handle, query, sizeof(query), "%s money = '%d', kills = '%d',", query, PlayerInfo[playerid][pMoney], PlayerInfo[playerid][pKills]);//... mysql_format(handle, query, sizeof(query), "%s deaths = '%d' WHERE id = '%d'", query, PlayerInfo[playerid][pDeaths], PlayerInfo[playerid][p_id]);

      Vielen Dank ;)