PHP - Programovanie (otázky / problémy)

Příspěvekod MaceZz » 27 říj 2019, 11:55

Zdravím, do tohoto topicu budem písať svoje problémy ohľadom PHP a všeobecne o programovaní web stránok. Budem rád, ak mi bude vedieť niekto pomôcť.

Programujem aktuálne registráciu a prihlásenie (všetko funguje tak, ako má), ale je tu jeden problém. Chcem registráciu urobiť tak, aby PHP script overil, či v databázi už existuje daný užívateľ alebo daný e-mail.

Môj script:
Kód: Vybrat vše
         <?php
            require_once 'sql.php';

            $nick = $_POST['nickname'];
            $pwd = $_POST['pwd'];
            $email = $_POST['e-mail'];

            $skontroluj = mysqli_query($db_con, "SELECT * FROM users");
            $result = mysqli_fetch_array($skontroluj, MYSQLI_BOTH);

            if(isset($_POST['registruj']))
            {
               if($result['nickname'] != $nick)
               {
                  echo "Registrácia prebehla úspešne!<br><br>Môžete sa prihlásiť!";
                  rl("2", "web.php");
               }
               else if($result['nickname'] == $nick)
               {
                  echo "Prezývka je už zaregistrovaná!";
                  rl("2", "web.php");
               }
               else if($result['email'] == $email)
               {
                  echo "E-mail je už registrovaný!";
                  rl("2", "web.php");
               }
            }
         ?>


Po zadaní prezývky, ktorá už v databází exsituje, mi to v poriadku vypíše chybovú hlášku, teda že užívateľ už existuje. Ale po zadaní e-mailu, ktorý v databázi existuje, mi to napíše že registrácia prebehla v priadku. Teda ono to vyzerá tak, ako keby ten script ignoroval poslednú časť else if. Neviete, kde môže byť problém?
MaceZz
Amatér
Amatér
 
Příspěvky: 48
Registrován: 01 zář 2019, 16:36

PHP - Programovanie (otázky / problémy)

od Rumcajz » 27 říj 2019, 11:55

A uz jsi vyzkousel treba tohle? Rumcajz
Rumcajz
Rumcajz
Patriot
Rumcajz
 
Příspěvky: 97323
Registrován: sob 29.led 1999 0:11:22

Re: PHP - Programovanie (otázky / problémy)

Příspěvekod ericek111 » 27 říj 2019, 17:11

Ahoj,

1. Prekristapána, nenačítavaj všetkých používateľov pre overenie jedného.
2. Používaj SQL constrainty/indexy pre vynútenie konzistentnosti dát:
Kód: Vybrat vše
ALTER TABLE `users` ADD CONSTRAINT Nick_Email UNIQUE (`nickname`, `email`);

3. Používaj MySQLi objekt, funkcie sú dead.
4. Nauč sa robiť s prepared statements alebo - úplne najlepšie - PDO.

K chybe v kóde:
- `mysqli_fetch_array` načíta len jeden riadok z databázy. Kontroluješ, či jeden (pravdepodobne prvý zaregistrovaný) používateľ nemá rovnaký nick ako zadaný do registračného formuláru.
- Musíš teda prejsť všetky riadky v tabuľke.
- V prvej podmienke kontroluješ, či zadaný nick sa nerovná nicku v tabuľke. Ak sa nerovná, podmienka platí a registrácia sa dokončí. Ak platí podmienka, prečo by pokračoval program v ďalších vetvách? Ak (x), tak (A), ináč (B). Ak platí x, spraví sa A, nie je dôvod robiť B. To isté platí pre if-else if.

V Tvojom kóde sa teda overí len (ne)existencia nicku.

Toto:
Kód: Vybrat vše
if (x) {
    A
} else if (y) {
    B
} else if (z) {
    C

je to isté ako toto, rozdiel je zrejmý:
Kód: Vybrat vše
if (x) {
    A
} else {
    if (y) {
        B
    
} else {
        if (z) {
            C
        
}
    }


Ideálne riešenie:
Kód: Vybrat vše
$pdo = new \PDO("mysql:host=localhost;dbname=database;charset=utf8mb4", "user", "pass");
$pdo->prepare('SELECT COUNT(*) FROM `users` WHERE `nickname` = ? OR `email` = ?');
$pdo->execute([ $nick, $email ]);
$isRegistered = $pdo->fetchColumn() > 0;
if ($isRegistered) {
    // ...
}
 


Bonus: prestaň načítavať každý súbor samostatne. Nauč sa pracovať s classami a využívaj autoloading podľa štandardu PSR-4.
Bonus 2: Zjednoť názvy premenných na front-ende a back-ende, vyhneš sa tak prípadným omylom. Viď `$email = $_GET['e-mail']`.
You either die a сука, or live long enough to become a блять.
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Uživatelský avatar
ericek111
CS:GO Admin
CS:GO Admin
 
Příspěvky: 1418
Registrován: 21 kvě 2017, 12:01
Bydliště: /home/erik

Re: PHP - Programovanie (otázky / problémy)

Příspěvekod MaceZz » 27 říj 2019, 19:51

ericek111 píše:Ahoj,

1. Prekristapána, nenačítavaj všetkých používateľov pre overenie jedného.
2. Používaj SQL constrainty/indexy pre vynútenie konzistentnosti dát:
Kód: Vybrat vše
ALTER TABLE `users` ADD CONSTRAINT Nick_Email UNIQUE (`nickname`, `email`);

3. Používaj MySQLi objekt, funkcie sú dead.
4. Nauč sa robiť s prepared statements alebo - úplne najlepšie - PDO.

K chybe v kóde:
- `mysqli_fetch_array` načíta len jeden riadok z databázy. Kontroluješ, či jeden (pravdepodobne prvý zaregistrovaný) používateľ nemá rovnaký nick ako zadaný do registračného formuláru.
- Musíš teda prejsť všetky riadky v tabuľke.
- V prvej podmienke kontroluješ, či zadaný nick sa nerovná nicku v tabuľke. Ak sa nerovná, podmienka platí a registrácia sa dokončí. Ak platí podmienka, prečo by pokračoval program v ďalších vetvách? Ak (x), tak (A), ináč (B). Ak platí x, spraví sa A, nie je dôvod robiť B. To isté platí pre if-else if.

V Tvojom kóde sa teda overí len (ne)existencia nicku.

Toto:
Kód: Vybrat vše
if (x) {
    A
} else if (y) {
    B
} else if (z) {
    C
}

je to isté ako toto, rozdiel je zrejmý:
Kód: Vybrat vše
if (x) {
    A
} else {
    if (y) {
        B
    
} else {
        if (z) {
            C
        
}
    }
}


Ideálne riešenie:
Kód: Vybrat vše
$pdo = new \PDO("mysql:host=localhost;dbname=database;charset=utf8mb4", "user", "pass");
$pdo->prepare('SELECT COUNT(*) FROM `users` WHERE `nickname` = ? OR `email` = ?');
$pdo->execute([ $nick, $email ]);
$isRegistered = $pdo->fetchColumn() > 0;
if ($isRegistered) {
    // ...
}


Bonus: prestaň načítavať každý súbor samostatne. Nauč sa pracovať s classami a využívaj autoloading podľa štandardu PSR-4.
Bonus 2: Zjednoť názvy premenných na front-ende a back-ende, vyhneš sa tak prípadným omylom. Viď `$email = $_GET['e-mail']`.

Dobre ďakuje vyskúšam. Vyskytol sa tu ďalší problém...

Na svojom VPS používam Debian 9, Mysql 8.0 a PHP 7.3. Nefungujú mi funkcie (v .php súboroch) na mysqli_ ani mysql_. Neviete, kde môže byť problém? MySQL aj PHP je správne nainštalované + upgradované. Neviem kde môže byť problém... aj som povolil extension v /etc/php/apache2/php.ini súbore, a stále nič.
MaceZz
Amatér
Amatér
 
Příspěvky: 48
Registrován: 01 zář 2019, 16:36

Re: PHP - Programovanie (otázky / problémy)

Příspěvekod ericek111 » 27 říj 2019, 21:45

Máš nainštalovaný extension MySQLi? Samotný MySQL/MariaDB server je len SQL databázovým providerom a PHP len interpreterom, potrebuješ medzi tým ešte lepidlo. Pre Debian to bude niečo ako php7.3-mysqli alebo ideálne php-mysqli ako alias pre najnovšiu verziu.

Apache vyhoď a nauč sa Nginx. :)
You either die a сука, or live long enough to become a блять.
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Uživatelský avatar
ericek111
CS:GO Admin
CS:GO Admin
 
Příspěvky: 1418
Registrován: 21 kvě 2017, 12:01
Bydliště: /home/erik

Re: PHP - Programovanie (otázky / problémy)

Příspěvekod MaceZz » 28 říj 2019, 00:00

Áno, všetko nainštalované mám. A stále nejde... aj som X krát reštartoval server.
MaceZz
Amatér
Amatér
 
Příspěvky: 48
Registrován: 01 zář 2019, 16:36

Re: PHP - Programovanie (otázky / problémy)

Příspěvekod MaceZz » 28 říj 2019, 08:32

Vyskúšal som PHP script spustiť na svojom NTB cez XAMPP a tam všetko funguje, zápis do databáze, všetko ide tak ako má. To znamená, že mi pravdepodobne chýba nejaký extension na VPS. Ale otázka je... aký...
MaceZz
Amatér
Amatér
 
Příspěvky: 48
Registrován: 01 zář 2019, 16:36

Re: PHP - Programovanie (otázky / problémy)

Příspěvekod MaceZz » 28 říj 2019, 10:26

Tak problém je zrejme vyriešený.

PHP 7.3 a MySQL som inštaloval zo .sh súboru, ktorý som vytvoril. Keď som príkazy zadal do VPS manuálne, tak už všetko funguje.

Otázka na záver:
Ako mám vytvoriť .sh súbor resp. ako mám do neho zapisovať príkazy tak, aby sa všetky vykonali správne?

Aktuálne súbor obsahuje toto:
Kód: Vybrat vše
apt update;
apt upgrade;
apt install lsb-release apt-transport-https ca-certificates;
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg;
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/php7.3.list;
apt install apache2 -y;
apt install libapache2-mod-php7.3 -y;
apt update;
apt upgrade;
wget http://repo.mysql.com/mysql-apt-config_0.8.13-1_all.deb;
dpkg -i mysql-apt-config_0.8.13-1_all.deb;
apt update;
apt install mysql-server -y;
apt install php7.3-mysql -y;
apt update;
apt upgrade;
apt install php7.3 -y;
apt install php7.3-cli php7.3-fpm php7.3-json php7.3-pdo php7.3-mysql php7.3-zip php7.3-gd php7.3-mbstring php7.3-curl php7.3-xml php7.3-bcmath -y;
MaceZz
Amatér
Amatér
 
Příspěvky: 48
Registrován: 01 zář 2019, 16:36

Re: PHP - Programovanie (otázky / problémy)

Příspěvekod ericek111 » 28 říj 2019, 11:50

Vôbec nie je potrebné príkazy oddeľovať bodkočiarkou. Na to sú skripty, aby ich vykonali sekvenčne - čo riadok, to príkaz. Určite by som ich preorganizoval - prv pridaj repozitáre, potom updatni, potom upgradni, potom inštaluj nové veci a všetky naraz.

Tak som si for fun vytvoril prázdny kontajner pre Debian 9, copy-pastol Tvoje príkazy do súboru a spustil ho. Keďže je Debian 9 pomerne starý, obchádzajú ho nové vydania softvéru a dostáva len nutné aktualizácie. Nainštalovala sa mi archaická verzia MariaDB 10.1 a nakoniec to zlyhalo pri PHP 7.3, keďže repozitáre obsahujú len PHP 7.0. Môj systém totiž neobsahoval wget, tak som to doinštaloval a spustil znovu. Potom mi chýbalo GPG kvôli MySQL repozitáru. Tak som nainštaloval gnupg a spustil znovu.

Potom to zas umrelo s chybou, pretože to nedokázalo upgradovať súbory veľmi zastaralého MySQL 5.7. Tam moja trpezlivosť skončila. Asi by stačilo iba vymazať priečinok starej inštalácie, ale meh...

Riešenie: používať distribúciu z tohto tisícročia.

Ak už chceš spájať inštalačné príkazy, používaj operátor &&, ktorý preruší vykonávanie reťaze príkazov, ak niektorý z nich vráti inú hodnotu ako 0 (0 = OK, iné = chyba).
You either die a сука, or live long enough to become a блять.
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Uživatelský avatar
ericek111
CS:GO Admin
CS:GO Admin
 
Příspěvky: 1418
Registrován: 21 kvě 2017, 12:01
Bydliště: /home/erik

Re: PHP - Programovanie (otázky / problémy)

Příspěvekod MaceZz » 29 říj 2019, 06:45

Takže takto by to bolo správne?

Kód: Vybrat vše
apt update
apt upgrade
&&
apt install lsb-release apt-transport-https ca-certificates
&&
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
&&
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/php7.3.list
&&
apt install apache2 -y
&&
apt install libapache2-mod-php7.3 -y
&&
wget http://repo.mysql.com/mysql-apt-config_0.8.13-1_all.deb
&&
dpkg -i mysql-apt-config_0.8.13-1_all.deb
&&
apt install mysql-server -y
&&
apt install php7.3-mysql -y
&&
apt install php7.3 -y
&&
apt install php7.3-cli php7.3-fpm php7.3-json php7.3-pdo php7.3-mysql php7.3-zip php7.3-gd php7.3-mbstring php7.3-curl php7.3-xml php7.3-bcmath -y
&&
apt update
apt upgrade
MaceZz
Amatér
Amatér
 
Příspěvky: 48
Registrován: 01 zář 2019, 16:36

Re: PHP - Programovanie (otázky / problémy)

Příspěvekod MaceZz » 30 říj 2019, 07:41

Tak teda mám ďalší problém:

Ako mám odosielať vzdialené príkazy do SSH? Používam následujúci kód, ale nefunguje.

Kód: Vybrat vše
                   <?php
                      $btn = $_POST['odosli'];

                      $pripoj = ssh2_connect('IP môjho Servera', 22);
                      ssh2_auth_password($pripoj, 'nic', 'nic');

                      if(isset($btn))
                      {
                         ssh2_exec($pripoj, 'cd');
                         ssh2_exec($pripoj, 'mkdir Tst');
                         echo "Hotovo!";
                      }
                   ?>
MaceZz
Amatér
Amatér
 
Příspěvky: 48
Registrován: 01 zář 2019, 16:36

Re: PHP - Programovanie (otázky / problémy)

Příspěvekod ericek111 » 30 říj 2019, 08:40

Prheeeečhoooooooooooo?????????????????????????????????????????????????????????????????????????????? :? :? :? :? :? :? :? :?

Ak chceš robiť veci na serveri vzdialene, urob si API. Ak už sa chceš silou mocou pripájať cez SSH, čo som ani nevedel, že v PHP ide, použi public key autentifikáciu.

Komentár pod dokumentáciou ssh2_connect:
Note: You may need to make sure you commands produce output so the response can be pulled. Some people suggest that the command is not executed until you pull the response back.

Potom sa na to ešte pozriem, vyzerá to zaujímavo. :D

P. S.: "Nefunguje" je široký pojem. Akoby si napísal na autofórum "nefunguje mi auto". Well, natankuj...
You either die a сука, or live long enough to become a блять.
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Uživatelský avatar
ericek111
CS:GO Admin
CS:GO Admin
 
Příspěvky: 1418
Registrován: 21 kvě 2017, 12:01
Bydliště: /home/erik

Re: PHP - Programovanie (otázky / problémy)

Příspěvekod MaceZz » 02 lis 2019, 10:26

Tak som sa teda na to pozrel, a zistil som, že základné funkcie v PHP už sú (mkdir, rmdir atď...) cez ne to funguje. Ale je tu ďalší problém... keď chcem súbor niekde presunúť, teda skopírovať (funkcia copy(); ), tak mi to neskopíruje. Nenapíše mi to ani žiadnu chybu.

EDIT: Práva na zápis do zložiek som nastavil.
MaceZz
Amatér
Amatér
 
Příspěvky: 48
Registrován: 01 zář 2019, 16:36


Zpět na Vyriešené topicy

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků