[ Shejn @ 09.08.2006. 22:52 ] @
E ovako,
pošto sam relativni početnik u php-u, voleo bih da mi date neki predlog kako da ovaj početnički primer učinim "još boljim".

Konkretno muči me sledeće:
- to što se posle provere unetih parametara, resetovanje unetih vrednosti radi sa refresh-om;
- kako da se ispisuju sve greške prilikom unosa traženih vrednosti a ne samo prva greška, u slučaju da je načinjena više od jedne greške;
- kako da se pored input filda u kojem je načinjena greška postavi *;
-
-
-

Ponavljam primer radi sve što sam zamislio (dobro ne baš sve ... ;-) ), ali može i bolje.


Code:

<html>
  <head>
  <meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
      <title>Primer koji vrši upis u MYSQL bazu i prikazuje unete podatke na zahtev korisnika</title>
  </head>
  <body >
<H2> Primer koji vrši upis u MYSQL bazu i prikazuje unete podatke na zahtev korisnika</H2>
<hr shade>
<font size=4>Molimo Vas unesite sledeće podatke kako biste se registrovali kao naš korisnik </font><br/><br/>
      <div style="margin-left: 200px">
      <form method="POST" >
        <table width="400" border="0" cellspacing="1" >
          <tr>
            <td width="100" align="right">Ime: </td>
            <td><input name="ime" type="text" id="ime" align="left" value="<?php if(isset($_POST['ime']) ) print($_POST['ime']); ?>" ></td>
          </tr>
          <tr>
            <td width="100"  align="right">Prezime: </td>
            <td><input name="prezime" type="text" id="prezime" align="left" value="<?php if(isset($_POST['prezime']) ) print($_POST['prezime']); ?>"  ></td>
          </tr>
          <tr>
          <td width="100" align="right">Korisnik: </td>
            <td><input name="korisnIme" type="text" id="korisnIme" align="left" value="<?php if(isset($_POST['korisnIme']) ) print($_POST['korisnIme']); ?>" ></td>
          </tr>
          <tr>
            <td width="100" align="right">Lozinka: </td>
            <td><input name="password" type="password" id="password" align="left"  value="<?php if(isset($_POST['password']) ) print($_POST['password']); ?>" ></td>
          </tr>          
          <tr>
            <td width="100">&nbsp;</td>
            <td>&nbsp;</td>
          </tr>
          <tr>
            <td width="100">&nbsp;</td>
            <td><input name="add" type="submit" id="add" value="Dodaj Korisnika">&nbsp;&nbsp;&nbsp;<input name="get" type="submit" id="get" value="Lista Korisnika"></td>
          </tr>
        </table>
      </form>
  </body>
</html>

<?php
    
    function prikaz($hostname, $dbuser, $dbpass)
    {
          
          $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql');
          
          $dbname = 'proba';
          mysql_select_db($dbname);
          
          $query  = "SELECT rednibroj, ime, prezime , korisnIme FROM user";
          $result = mysql_query($query);


          echo"<br/><br/>";
          echo"<table border='1' cellpadding='0'>";
          echo "<tr><td bgcolor=\"#AAAAAA\" width='100' align='center' ><font size=5 color=\"blue\">RBR</font> </td><td bgcolor=\"#AAAAAA\" width='150' align='center' ><font size=5 color=\"blue\"> IME</font> </td><td bgcolor=\"#AAAAAA\" width='150' align='center' ><font size=5 color=\"blue\"> PREZIME </font> </td><td bgcolor=\"#AAAAAA\" width='150' align='center' ><font size=5 color=\"blue\"> KORISNIK </font> </td></tr>";
            
          while($row = @mysql_fetch_array($result, MYSQL_ASSOC))
          {
            $rbr=$row['rednibroj'];
            $ime = $row['ime'];
            $prezime = $row['prezime'];
            $korisnIme = $row['korisnIme'];
           
            echo "<tr><td width='100' align='center'>$rbr</td><td width='150' align='center'>$ime</td><td width='150' align='center'>$prezime</td><td width='150' align='center'>$korisnIme</td></tr>";
          }
           echo"</table>";

          mysql_close($conn);
    }

    function unos($hostname, $dbuser, $dbpass)
    {
        $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql');
          
        $dbname = 'proba';
        mysql_select_db($dbname);
          
        $ime = $_POST['ime'];
        $prezime = $_POST['prezime'];
        $korisnIme = $_POST['korisnIme'];
        $password = $_POST['password'];
          
        if(!isset($ime) || (trim($ime) == '')){
            echo"<p><font size=4 color='red'><ul><li>Morate uneti Ime ! </li></ul></font></p>";
        }
        else if(!isset($prezime) || (trim($prezime) == ''))
        {
            echo"<p><font size=4 color='red'><ul><li>Morate uneti Prezime ! </li></ul></font></p>";
        }
        else if(!isset($korisnIme) || (trim($korisnIme) == ''))
        {
            echo"<p><font size=4 color='red'><ul><li>Morate uneti Korisničko ime ! </li></ul></font></p>";
        }
        else if(!isset($password) || (trim($password) == ''))
        {
            echo"<p><font size=4 color='red'><ul><li>Morate uneti lozinku ! </li></ul></font></p>";
        }
        else{
            $query = "INSERT INTO user (ime, prezime, korisnIme, password) VALUES ('$ime', '$prezime', '$korisnIme', PASSWORD('$password'))";
            mysql_query($query);
                     
            mysql_close($conn);
                      
            echo '<META http-equiv="refresh" content="0;URL=http://127.0.0.1/test.php">'; 
            exit; 
        }
    }
      
    if(isset($_POST['add']))
    {
        unos('127.0.0.1','php','test');
    }
      
    if (isset($_POST['get']))
    {
        prikaz('127.0.0.1','php','test');
    }

?>



Hvala na strpljenju i predlozima ...
[ kelja @ 10.08.2006. 00:26 ] @
Zdravo,evo odgovora od jos jednog 'relativnog pocetnika'(svidja mi se formulacija;-))
1)?
2)ne mozes da koristis 'else if' ako zelis da omogucis ispisivanje svih gresaka-koristi samo' if 'naredbu(poslednja-unos u bazu-ostaje else,dakako)
3)Vrlo lako:
Code:

<td><input name="ime" type="text" id="ime" align="left" value="<?php if(isset($_POST['ime']) ) print($_POST['ime'])?>" ><?php if(isset($_POST['add'])) if($_POST['ime']=="")echo "*";?></td>

Pozdrav!
[ Shejn @ 10.08.2006. 08:08 ] @
Hvala na brzom odgovoru.

Što se tiče druge stavke, znam kako se koristi if i elseif ;-), ali sam mislio na rešenje tipa upotrebe neke funkcije u kojoj se beleže sve greške u jedan niz a zatim se taj niz izlista ... ili nešto slično ...
Kod treće stavke sam napravio klasičnu početničku grešku umesto ovoga što si ti napisao ja sam pokušavao sa sledećim:
Citat:

<td><input name="ime" type="text" id="ime" align="left" value="<?php if(isset($_POST['ime']) ) print($_POST['ime']); ?>" ><?php if( isset($_POST['add']) && ( !isset($_POST['ime']) ) echo"<font size=3 color='red'> *</font>"; ?></td>


, u svakom slučaju, hvala ti PUUUNO na odgovoru ...
[ Shejn @ 10.08.2006. 10:06 ] @
Evo sredio sam i "problem" broj dva, vezan za ispis svih načinjenih grešaka, ubacivanjem još jedne funkcije flag_error. Evo kako to izgleda sada:

Code:

<html>
  <head>
      <meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
      <title>Primer koji vrši upis u MYSQL bazu i prikazuje unete podatke na zahtev korisnika</title>
  </head>
  <body >
<H2> Primer koji vrši upis u MYSQL bazu i prikazuje unete podatke na zahtev korisnika</H2>
<hr shade>
<font size=4>Molimo Vas unesite sledeće podatke kako biste se registrovali kao naš korisnik </font><br/><br/>
      <div style="margin-left: 200px">
      <form action="<?php print($PHP_SELF); ?>" method="POST" >
        <table width="400" border="0" cellspacing="1" >
          <tr>
            <td width="100" align="right">Ime: </td>
            <td><input name="ime" type="text" id="ime" align="left" value="<?php if(isset($_POST['ime']) ) print($_POST['ime']); ?>" > <?php if( isset($_POST['add']) ) if( $_POST['ime']== "")  echo"<font size=3 color='red'> * </font>"; ?>
            </td>
          </tr>
          <tr>
            <td width="100"  align="right">Prezime: </td>
            <td><input name="prezime" type="text" id="prezime" align="left" value="<?php if(isset($_POST['prezime']) ) print($_POST['prezime']); ?>"  > <?php if( isset($_POST['add']) )  if( $_POST['prezime']== "")  echo"<font size=3 color='red'> * </font>"; ?></td>
          </tr>
          <tr>
          <td width="100" align="right">Korisnik: </td>
            <td><input name="korisnIme" type="text" id="korisnIme" align="left" value="<?php if(isset($_POST['korisnIme']) ) print($_POST['korisnIme']); ?>" > <?php if( isset($_POST['add']) )  if( $_POST['korisnIme']== "")  echo"<font size=3 color='red'> * </font>"; ?></td>
          </tr>
          <tr>
            <td width="100" align="right">Lozinka: </td>
            <td><input name="password" type="password" id="password" align="left"  value="<?php if(isset($_POST['password']) ) print($_POST['password']); ?>" > <?php if( isset($_POST['add']) )  if( $_POST['password']== "")  echo"<font size=3 color='red'> * </font>"; ?></td>
          </tr>          
          <tr>
            <td width="100">&nbsp;</td>
            <td>&nbsp;</td>
          </tr>
          <tr>
            <td width="100">&nbsp;</td>
            <td><input name="add" type="submit" id="add" value="Dodaj Korisnika">&nbsp;&nbsp;&nbsp;<input name="get" type="submit" id="get" value="Lista Korisnika"></td>
          </tr>
        </table>
      </form>
  </body>
</html>
<?php
    
    function flag_error($fieldname,$errstr){
            global $field_with_errors, $errors;
            $fields_with_errors[$fieldname]  = 1;
            $errors[] = $errstr;
    }
    
    function prikaz($hostname, $dbuser, $dbpass)
    {
          
          $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql');
          
          $dbname = 'proba';
          mysql_select_db($dbname);
          
          $query  = "SELECT  rbr, ime, prezime , korisnIme FROM user";
          $result = mysql_query($query);

            echo"<br/><br/>";
            echo"<table border='1' cellpadding='0'>";
            echo "<tr><td bgcolor=\"#AAAAAA\" width='100' align='center' ><font size=5 color=\"blue\">RBR</font> </td><td bgcolor=\"#AAAAAA\" width='150' align='center' ><font size=5 color=\"blue\"> IME</font> </td><td bgcolor=\"#AAAAAA\" width='150' align='center' ><font size=5 color=\"blue\"> PREZIME </font> </td><td bgcolor=\"#AAAAAA\" width='150' align='center' ><font size=5 color=\"blue\"> KORISNIK </font> </td></tr>";
            
          while($row = @mysql_fetch_array($result, MYSQL_ASSOC))
          {
                    $rbr=$row['rednibroj'];
                    $ime = $row['ime'];
                    $prezime = $row['prezime'];
                    $korisnIme = $row['korisnIme'];
                   
                    echo "<tr><td width='100' align='center'>$rbr</td><td width='150' align='center'>$ime</td><td width='150' align='center'>$prezime</td><td width='150' align='center'>$korisnIme</td></tr>";
          }
           echo"</table>";

          mysql_close($conn);
}

function unos($hostname, $dbuser, $dbpass)
    {

          $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql');
          
          $dbname = 'proba';
          mysql_select_db($dbname);
          
          $ime = $_POST['ime'];
          $prezime = $_POST['prezime'];
          $korisnIme = $_POST['korisnIme'];
          $password = $_POST['password'];

          $query = "INSERT INTO user (ime, prezime, korisnIme, password) VALUES ('$ime', '$prezime', '$korisnIme', PASSWORD('$password'))";
          mysql_query($query);
             
          mysql_close($conn);
              
        }
      
      if(isset($_POST['add']))
      {
 
          if(trim($_POST['ime']) == '')
                  flag_error ('ime','Morate uneti Ime !');
          if(trim($_POST['prezime']) == '')
                  flag_error('prezime','Morate uneti Prezime !');
          if(trim( $_POST['korisnIme']) == '')
                  flag_error('korisnIme','Morate uneti Korisničko ime !');
          if(trim( $_POST['password']) == '')
                  flag_error('password','Morate uneti lozinku ! ');
            
          if (count ($errors) > 0){
                            
                  $n= count ($errors);
                  echo"<br/><br/><P><font size=4 color='red'>Greška prilikom prijave. Molimo Vas ispravite sledeća polja: </font></P><ul>";
                  for ($i=0; $i < $n; $i++){
                            echo"<P><font size=3 color='red'><li>" .$errors[$i]. " </li></font></P>\n";
                  }
                  echo"</ul>";
          }
          else{
                  unos('127.0.0.1','php','test');
                            
                  echo '<META http-equiv="refresh" content="0;URL=http://212.200.81.65/testMysql.php">';
                  exit;
          }
      }
      
      if (isset($_POST['get']))
      {
            prikaz('127.0.0.1','php','test');
      }

?>


, i dalje bih voleo da čujem vaše predloge šta je potrebno poboljšati ...


Da, ako nekoga interesuje kako to izgleda može pogledati na adresi http://212.200.81.65/testMysql.php , jeste da je sporo ali ovo je samo mali početnički primer ...

[ broker @ 10.08.2006. 10:51 ] @
Razdvoj HTML i PHP kod. Odvoj funkcije u poseban .php kao biblioteku.
[ mb_sa @ 10.08.2006. 11:57 ] @
Poboljsaj funkciju Unos(), tako sto ces sprijeciti dupli unos, jer sta ako ti se neko registruje sa istim korsinickim imnemom?

Takodjer, bi onemogucio koristenje specijlanih znakova u svim poljima, osim mozda u password, gdje bi ostavio neke (poput !,...), duzinu korsinickog imena i passwroda (moze ti se neko regati sa un: a i pass: a, sto i nije bas pametno).

EDIT: I da, koristi CSS umjesto zastarjelih HTML tagova
[ sale83 @ 10.08.2006. 13:18 ] @
Pre nego sto nastavis dalje:

Ako stvarno zelis da radis sa PHP-om onda prvo treba da se upoznas sa ovim i da dobro ukapiras o cemu je rec:

http://phpsec.org/projects/guide/sr/


SIGURNOST - Jako bitna stvar.
[ kelja @ 10.08.2006. 13:40 ] @
Samo jedna napomena:nisi pazljivo procitao moj prvi post...nije bilo(preterane) potrebe da pravis jos jednu funkciju za ispis SVIHgresaka.Dovoljno je bilo da uradis ono sto sam ti napomenuo:
Code:

 if(!isset($ime) || (trim($ime) == '')){
            echo"<p><font size=4 color='red'><ul><li>Morate uneti Ime ! </li></ul></font></p>";
        }
         if(!isset($prezime) || (trim($prezime) == ''))
        {
            echo"<p><font size=4 color='red'><ul><li>Morate uneti Prezime ! </li></ul></font></p>";
        }
         if(!isset($korisnIme) || (trim($korisnIme) == ''))
        {
            echo"<p><font size=4 color='red'><ul><li>Morate uneti Korisničko ime ! </li></ul></font></p>";
        }
       if(!isset($password) || (trim($password) == ''))
        {
            echo"<p><font size=4 color='red'><ul><li>Morate uneti lozinku ! </li></ul></font></p>";
        }
        else{...

Znaci if umesto else if...ali dobro...rad sa funkcijama je svakako mnogo zahvalniji...
E da,ako moze neki primer sql injection-a koji bi mogao da se odradi na ovom kodu...To bi me bas zanimalo...Pozdrav!
[ Shejn @ 10.08.2006. 16:04 ] @
Hvala na predlozima i sugestijama, vrlo su konstruktivni.

Jel ima neko predlog kako da obrišem polja za unos nakon uspešnog unosa? Ja sam to uradio sa refreshom, ali verujem da postoji elegantnije rešenje.

Pozdrav ...
[ glavince @ 10.08.2006. 16:32 ] @
Malo mi je kod nepregledan i prenatrupan.
Prvo ja bi napravio exteran fajl za konekciju.
A ostalo bi izgledalo slicno ovome:
Code:

<?  
class proverka {

function forma() {
// forma za unos
}
function korisnici() {
/*
query (select korisnIme from user where korisnIme = $_POST['korisnIme'])
$br = mysql_num_rows($query);
return $br;
da bi proverio dali postoji takav user
*/
}
function unos() {
/*
queri za unos
if (!query) greska pri izvrsavanju
else poruka da je sve u redu
*/
}
function prikaz() {
/*
prikaz
*/
}
function greski() {
//pravis nizu od moguce greske
global $greska;
if(!isset($_POST['ime']) || (trim($_POST['ime']) == ''))          {$greska[] = 'Morate uneti Ime !'};
if(!isset($_POST['prezime']) || (trim($_POST['prezime']) == ''))  {$greska[] = 'Morate uneti Prezime !'};
if($this->korisnici() > 0)                                           {$greska[] = 'Postoi takav korisnik !'};
//i t.d.
}
function prikazi_greski() {
global $greska;
foreach($greska as $problem) {
echo $problem."<br>";
}
}

$proverka = new proverka;
$greska = array();
if (isset($_POST['add'])) {
    $proverka->greski();
    if (count($greska) != 0) {
    $proverka->forma();
    $proverka->prikazi_greski();
    } else {
    $proverka->unos();
    $proverka->prikaz(); //nemas vise polja za unos
    }
} else {
$proverka->forma();
if (isset($_POST['get'])) {
$proverka->prikaz()
}
}
?>

Ovde nema bas potrebe od clase al jeb*ga
[ lukeguy @ 11.08.2006. 01:19 ] @
Kakav ti reset treba? Ako želiš da korisnik ima mogućnost da obriše celu formu u toku popunjavanja, onda koritiš reset dugme koje postoji u HTML specifikaciji.

Za obradu grešaka imaš više načina. Ja konkretno imam malo drugačiju strukturu dokumenta. Na početku se proverava da li u $_POST (ili već šta koristiš) ima podataka. Ako ima, radi se validacija podataka (do kraja!) i svaka greška se upisuje u array. Možeš da posebno napraviš jedan array gde ćeš čuvati tekstualni opis greške, jedan za čuvanje imena polja sa greškom itd. Kad se uradi validacija, ide kod koji ispisuje stranicu. U tom kodu ubaciš da se na početku ispišu sve greške iz arraya (ako želiš da greške stoje na vrhu stranice), a potom kad god ispisuješ neko polje ako to polje sadrži grešku ispred njega ubacuješ zvezdicu. Dakle, u odnosu na ovo tvoje, gde ti već imaš upisivanje unetih vrednosti, samo dodaš još ubacivanje tih zvezdica.

Valjda će ti ovo pomoći...
[ Shejn @ 11.08.2006. 07:15 ] @
@lukeguy
haha baš sam upravo isprobavao tu funnkciju sa arrayom ...
Što se tiče reseta, kao što rekoh, treba da se obrišu podaci uneti u formu prilikom pritiska na dugme Submit, ako nema nikakve greške. Prvo rešenje ovog problema se sastojalo u tome što sam radio refresh strane, drugo rešenje koje je sada trenutno implementirano je izvedano uz pomoć JavaScripta, i izgleda ovako:
Code:

          .
          .
          .
          else{
                  unos('localhost','user','password');

                  echo"<script type='text/javascript'> 
                  forma.ime.value = '';
                  forma.ime.focus(); 
                  forma.prezime.value = '';
                  forma.korisnIme.value = '';
                  forma.password.value = '';
                  </script>";
          }
          .
          .
          .


ovo izgleda OK, ali bih ja hteo da izbegnem JavaScript što je više moguće ...
[ lukeguy @ 11.08.2006. 21:53 ] @
Da, to sam zaboravio da ti napišem u prethodnom postu. Dakle, krećemo od toga da kod počinje sa jednim if koje pita da li $_POST sadrži bilo šta. Ako sadrži radiš validaciju i ono gore što sam pisao. Ako NE sadrži, onda iscrtavaš praznu formu.

Pretpostavljam da ti hoćeš da se posle uspešnog popunjavanja forme ispiše nekakav Thank you red. To radiš pomoću funkcije za validaciju. Ako ona vrati true (ili se kod za validaciju evaluira kao true) onda ispišeš to Thank you (ili resetuješ formu). Ako funkcija vrati false ispisuješ greške i zvezdice.

Btw, ovo podrazumeva da ti kod za evaluaciju vraća neku vrednost. Pa onda ili napravi funkciju ili nekakav složeni if.