MySQL - How to?
Zdravím, programujem svoj web, a snažím sa dajako urobiť login / register systém. Nepíše mi to nikde žiadnu chybu, skrátka to nevytvára nových užívateľov do databáze,
Kód
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Admin Panel © <?php $date = date("Y"); echo "$date"; ?></title>
<!-- BOOTSTRAP STYLES-->
<link href="assets/css/bootstrap.css" rel="stylesheet" />
<!-- FONTAWESOME STYLES-->
<link href="assets/css/font-awesome.css" rel="stylesheet" />
<!-- CUSTOM STYLES-->
<link href="assets/css/custom.css" rel="stylesheet" />
<!-- GOOGLE FONTS-->
<link href='http://fonts.googleapis.com/css?family=Open+Sans' rel='stylesheet' type='text/css' />
</head>
<body>
<div id="wrapper">
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="adjust-nav">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".sidebar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<span class="logout-spn" >
<a href="#" style="color:#fff;">PRIHLÁSIŤ SA</a>
</span>
</div>
</div>
<!-- /. NAV TOP -->
<nav class="navbar-default navbar-side" role="navigation">
<div class="sidebar-collapse">
<ul class="nav" id="main-menu">
<li>
<a href="login.php">Prihlásiť sa</a>
</li>
<li class="active-link">
<a href="register.php">Registrácia</a>
</li>
</ul>
</div>
</nav>
<!-- /. NAV SIDE -->
<div id="page-wrapper" >
<div id="page-inner">
<div class="row">
<div class="col-md-12">
<h2>ZAREGISTROVAŤ SA</h2>
</div>
</div>
<!-- /. ROW -->
<hr />
<center>
<form action="#" method="post">
Nickname: <sup style="color: #FF0000;">Required!</sup> <input type="text" name="nickname" pattern="[a-zA-Z0-9]+" class="form-control" required=""><br><br>
Heslo: <sup style="color: #FF0000;">Required!</sup> <input type="password" name="pwd1" class="form-control" required=""><br><br>
Heslo znovu: <sup style="color: #FF0000;">Required!</sup> <input type="password" name="pwd2" class="form-control" required=""><br><br>
E-mail: <sup style="color: #FF0000;">Required!</sup> <input type="email" name="email" class="form-control" required=""><br><br>
ANTI-SPAM <sup style="color: #FF0000;">Zadajte aktuálny rok</sup> <input type="text" name="rok" pattern="[0-9]+" required=""><br><br>
<input type="submit" value="Vytvoriť účet" name="submitForm" class="btn btn-success"><br><br>
<?php
$rok = date("Y");
$nickname = $_POST['nickname'];
$pwd1 = md5($_POST['pwd1']);
$pwd2 = md5($_POST['pwd2']);
$mail = $_POST['email'];
$antispam = $_POST['rok'];
$submit = $_POST['submitForm'];
$existujen = mysql_query('SELECT COUNT(*) FROM users WHERE nickname=? LIMIT 1', $_POST['nickname']);
$existujem = mysql_query('SELECT COUNT(*) FROM users WHERE email=? LIMIT 1', $_POST['email']);
if (isset($submit)) {
$mysql_server = "localhost";
$mysql_user = "root";
$mysql_password = "Nemusíš Vedieť :)";
$mysql_db = "newdbtest";
$mysqli = new mysqli($mysql_server, $mysql_user, $mysql_password, $mysql_db);
if ($mysqli->connect_errno) {
printf("Connection failed: %s \n", $mysqli->connect_error);
exit();
}
$mysqli->set_charset("utf8");
if ($pwd1 == $pwd2) {
if ($antispam == $rok) {
if ($existujen) {
echo "Užívateľ s týmto nick-om už existuje!";
} else {
if ($existujem) {
echo "Užívateľ s týmto e-mail-om už existuje!";
} else {
mysql_query('INSERT INTO users (nickname, password, mail) VALUES ($nickname, $pwd1, $mail)');
$_SESSION['nickname'] = $nickname;
echo "Váš účet bol vytvorený! Môžete sa <a href=\"login.php\">prihlásiť</a>.";
}
}
} else {
echo "CHYBA: Zle vyplnený anti-spam!";
header("refresh:3; url=register.php");
}
} else {
echo "CHYBA: Heslá nesúhlasia!";
header("refresh:3; url=register.php");
}
}
?>
</form>
</center>
<!-- /. ROW -->
</div>
<!-- /. PAGE INNER -->
</div>
<!-- /. PAGE WRAPPER -->
</div>
<div class="footer">
<div class="row">
<div id="col-lg-12">
© <?php echo "$date"; ?> By RayCodeUwU | Všetky práva vyhradené!
</div>
</div>
</div>
<!-- /. WRAPPER -->
<!-- SCRIPTS -AT THE BOTOM TO REDUCE THE LOAD TIME-->
<!-- JQUERY SCRIPTS -->
<script src="assets/js/jquery-1.10.2.js"></script>
<!-- BOOTSTRAP SCRIPTS -->
<script src="assets/js/bootstrap.min.js"></script>
<!-- CUSTOM SCRIPTS -->
<script src="assets/js/custom.js"></script>
</body>
</html>
Viem, že pre niektoré oči tento kód nie je najlepšie napísaný, ale zamerajme sa prosím na hlavný problém -> Teda, prečo nefunguje tvorba users do databáze.
Asi málokomu se bude chtít procházet celý kód... Příčin, proč to nefunguje, může být spousta, nevíme, jak máš vytvořenou databázi a tabulku, práva zápisu, atd...
Nejjednodušší způsob je, když si kód odkrokuješ a budeš si průběžně vypisovat proměnné - jestli obsahují požadovanou hodnotu.
Máš povolený error reporting?
https://www.php.net/manual/en/function.error-reporting.php
Myslím si, že chyba by mala byť niekde v tejto časti nie?
mysql_query je removed
https://www.php.net/supported-versions.php
https://www.php.net/manual/en/function.mysql-query.php
použij podporovaný způsob dotazu
Tak som to vyriešil. Chyba bola v jednoduchých úvodzovkách ( ' ' ). Ale je tu ďalší problém. Keď vytvorím užívateľa, a chcem vytvoriť znova toho istého, tak ho vytvorí, aj keď som naprogramoval, že ho vytvoriť nemá (ak už existuje) a aj tak ho vytvorí.
mysql_query som zmenil na mysqli_query.
Tomu se mi skoro nechce věřit.
Tohle ti funguje? Když si echem vypíšeš proměnnou $existujen, obsahuje něco?
Keď si prečítaš dokumentáciu k mysqli_query, tak uvidíš, že táto funkcia vráti hodnotu podľa toho, či prebehla úspešne:
Túto návratovú hodnotu by si mal testovať pri každom volaní mysqli_query. Ku presnej chybe sa potom dostaneš pomocou funkcie mysqli_error.
Aby ti nevznikali duplicitní používatelia v databáze, tak si pridaj UNIQUE constraint do MySQL tabuľky, pretože toto by si mal mať ošetrené hlavne v databáze, a až potom v PHP aplikácii.
Tak som teda vyskúšal čo ste mi poradili (los a host), a z polovice je to už funkčné.
Keď som chcel vypísať $existujen, nič to nevypísalo.
Nastavil som v databázi UNIQUE, a teraz už to nevytvorí užívateľa s tým istým nickom. Lenže ďalší problém je ten, že aj keď to už síce funguje ako má, po kliknutí na tlačítko zaregistrovať sa mi to napíše aj tak "účet bol vytvorený..." ako mám docieliť, aby mi to napísalo to, čo tam mám? Teda "Uživ. s tímto nick-om existuje" a "Užív. s týmto mailom už existuje..."?
Zapomněl jsi zmínit i mě, protože kdybys neaplikoval to co jsem napsal, tak bys tam měl furt toho kočkopsa mysql/mysqli.
Co se týče aktuální otázky, to neumíš googlit? Třeba mysqli check exist.
žiaľ, nič som nenašiel.
Google mi hned na prvním místě dal odpověď:
https://stackoverflow.com/questions/22252904/how-to-check-if-a-row-exists-in-mysql-i-e-check-if-an-email-exists-in-mysql
to tam musíš mít taky, dyť je tam co chceš.
Pretože nekontroluješ návratovú hodnotu funkcie mysqli_query. Doplň kontrolu a zistíš, prečo to nefunguje.
Ako?
Dal jsem ti odkaz, v něm je co chceš, tak co furt řešíš???
Tak som teda hodil celý kód do jedného "online checker-u". Ten vypísal tieto chyby:
Nič viac. A STÁLE NECHÁPEM, PREČO MI NEUKAZUJE SPRÁVNY TEXT, KTORÝ UKAZOVAŤ MÁ (Uživ. už existuje... atď...)
A znova.
Dal jsem ti odkaz, v něm je co chceš, tak co furt řešíš???
Takéto chyby by ti mal vypisovat aj tvoj server, na ktorom tú aplikáciu testuješ. Nastav si poriadne error reporting.
Toto je chyba, kvôli ktorej ti to nefunguje. Naštuduj si, ako sa používa mysqli:
Objektový prístup ti bude asi vyhovovať viac, t.j. $mysqli->query namiesto mysqli_query.
Chyba, ktorú celý čas riešiš, je spôsobená tým, že nesprávne posielaš parametre do SQL príkazu. V jednom prípade tam máš bezpečnostnú dieru typu SQL injection, a v druhom prípade si dal SQL parametre ako argumenty do mysqli_query funkcie, tak sa to ale nerobí.
Tak som popozeral rôzne návody na internete, aj na YouTube, aj stránky ako je táto (https://mujskript.cz/mysql/306-jednoduche-prihlaseni-v-php-a-mysql#registrace) a stále bez zmeny. Fakt netuším už, kde by mohla byť chyba. Samozrejme MySQL som zamenil za MySQLi...
Toto fakt už není možné.
Ty to sem chceš zkopírovat???
Takže ctrl+c a ctrl+v z toho odkazu, co jsem tu dal:
Nech sa páči ->
Vyskúšaj si to skopírovať do svojho .php súboru, a pokiaľ ti to pôjde bez problémov, tak mám asi pokazené VPS... Lebo mne to skrátka stále nejde.
Tak si ten tvůj kód projdi několikrát a pokud budeš u toho i myslet, tak na to přijdeš, proč ti to nejde.
Malá nápověda: $mysqli
(můj tip, do Vánoc ti to možná bude fungovat)
Budeš taký dobrý a napíšeš kde je chyba? Konkrétne?
Těch chyb tam bude mraky, ale ta, co řešíme teď (ověření jestli existuje mail/nickname) tak to podle mě v první řadě nefunguje proto, protože nejdřív máš dotaz na databázi (query) a teprve potom jsi vytvořil připojení $mysqli a ve druhé řadě být tebou tak se mrknu jak se připojuje do databáze (mysqli objektově vs mysqli procedurálně) a ve třetí řadě co to je ks**** za kód, proč nezkopneš nějaký už udělaný z netu?
Funguje, ďakujem :).