Probleme cu meniu interactiv de selectie de tabel SQL

Secţiune dedicată începatorilor.

Moderatori: Moderatori, Start Moderator

Avatar utilizator
maniac0man
PHPRomania Supporter
Mesaje: 13
Membru din: Vin Aug 31, 2007 9:30 pm

Probleme cu meniu interactiv de selectie de tabel SQL

Mesajde maniac0man » Lun Sep 03, 2007 6:05 pm

Salut !

Incerc sa fac un meniu din care sa selectez diferite tabele dint`o baza de date !

Problema este ca meniul vreau sa functioneze pe o variabila logic care sa`mi inlocuiasca numele de tabel !

Cum fac meniul asta ? daka io am 5 fishiere care contin acea variabila ?
Meniu:

Cod: Selectaţi tot

<form name="form1" id="form1">
  <select name="menu1" onchange="MM_jumpMenu('parent',this,0)">
    <option>Nume Tabel 1</option>
   <option>Nume Tabel 2</option>
   .
   .
   .
   .<option>Nume Tabel n</optin>
  </select>
</form>


Vreau ca numele de tabel sa fie inlocuit in functiile !
Variabila Nume tabel :

Cod: Selectaţi tot

$query ="INSERT INTO `Nume Baza SQL`.`Nume tabel`  - (fishierul 1)
$query = "SELECT * FROM Nume tabel - (fishierul 2)
$query = "SELECT * FROM Nume tabel where id=".$id.""; - (fisierul 3)
$sql = "delete from Nume tabel where id=".$id.""; - ( fishierul 4)
$sql = "update Nume tabel set Nume_Produs='". $_POST['Nume']."', Pret_P..... - (fishierul 5)



Sper ca m`am exprimat corect !



Avatar utilizator
maniac0man
PHPRomania Supporter
Mesaje: 13
Membru din: Vin Aug 31, 2007 9:30 pm

Mesajde maniac0man » Lun Sep 03, 2007 11:26 pm

Nu cred ca nu shtie nimeni ! poate nu s`a intels ce vreau sa fac !


Ex:

Nume Baza de date : Produse

Tebele din bza de date : Sony
Panasonic
etc .

Vreau sa shtiu cum pot modifica intrari in 2 tabele diferite de pe aceeashi interfaza ... adik vreau un script care sa poata sa`mi schimbe de pe un tabel pe altu !

Adik dau pe sony shi fac tot felu de intrari delete
apoi schimb panasonic shi la fel fac tot felul de modificari ... fara ca sa fac formulare ptr fiecare tabel in parte sa pot adauga in ele !
PLSSSSS !!!!!

Avatar utilizator
Amenthes
Senior Member
Mesaje: 1370
Membru din: Lun Dec 12, 2005 8:00 am
Contact:

Mesajde Amenthes » Mar Sep 04, 2007 1:16 am

Cand ai nevoie de o functionalitate in care variaza cateva lucruri minore faci o functie cu cativa parametri - lucrurile care variaza.

Cod: Selectaţi tot


function processInfo( $nume_tabel ) {
    // query-urile de care ai tu nevoie tu numele tabelului fiind $nume_table
    // ma rog, sunt sigur ca iti dadusei seama de asta :) dar am zis sa fie
}


In cazul tau vei apela functia cu parametrul fiind o variabila $_POST:

function($_POST['nume_tabel'])

Numai nu uita sa folosesti un mysql_real_escape_string inainte sa bagi variabila in query. A, si foloseste mysql_real_escape_string dupa ce verifici daca magic_quotes_gpc (get_magic_quotes_gpc) are on, si daca da, stripslashes la toate variabilele superglobale ($_POST, $_GET, $_REQUEST, $_COOKIE).

Sper sa te ajute.[/code]

Avatar utilizator
maniac0man
PHPRomania Supporter
Mesaje: 13
Membru din: Vin Aug 31, 2007 9:30 pm

Mesajde maniac0man » Mar Sep 04, 2007 3:50 am

Sincer cred ca e o explicatzie buna dar nu ptr un incepator ca mine !

Deci m`ai bagat total in ceatza !

Avatar utilizator
Amenthes
Senior Member
Mesaje: 1370
Membru din: Lun Dec 12, 2005 8:00 am
Contact:

Mesajde Amenthes » Mar Sep 04, 2007 4:18 am

Ok, hai ca incerc altfel:

Din cate inteleg tu o sa ai un element HTML select cam asa:
Apropo, sa scoti eventul de onchange pus de dreamweaver, altfel nu mai e valabil ce zic eu aici.

Cod: Selectaţi tot

<form action="fisier_php_care_executa_query_la_DB.php" method="post">
   <select name="nume_tabel">
      <option>tabel 1</option>
      <option>tabel 2</option>
      <option>tabel 3</option>
      <option>tabel 4</option>
   </select>
   <input type="submit">
</form


Tu cand dai submit la formularul asta, o sa ai la dispozitie in fisier_php_care_executa_query_la_DB.php variabila supergolabala (adica o poti accesa de oriunde in codul tau - functie, clasa sau cod simplu) $_POST

In ea o sa gasesti numele tabelului selectat in select daca citesti $_POST['nume_tabel']. E, asta e variabila care iti trebuie tie, ca... asta variaza in codul tau, nu? Numele tabelelui.

Daca query-urile pe care vrei sa le faci la DB arata la fel si doar numele tabelelui variaza atunci e aiurea sa stai sa scrii 4 query-uri pentru 4 tabele adica in total 16 query-uri. Mai bine faci o functie care primeste ca argument numele tabelului pe care trebuie sa il modifice sau ce i-o mai face.

Cod: Selectaţi tot

    function proceseazaTabel($nume_tabel) {
        // aici ne asiguram ca scriptul nu e vulnerabil la SQL injection
        $nume_tabel = mysql_real_escape_string($nume_tabel);

        $query1 = "SELECT * FROM " . $nume_table . "ORDER BY date";
        mysql_query($query1) or die(mysql_error());
        // celelalte query-uri
        $query4 = "....";
        mysql_query($query4) or die(mysql_error());
    }


Asta a fost functia, sa zicem ca o pui la inceputul fisierului al doilea, adica acolo unde te duce formularul.
Acum nu iti mai ramane decat sa apelezi functia asa:

Cod: Selectaţi tot

        proceseaza($_POST['nume_tabel']);


Cam asta e solutia, insa, nu stiu ce vrei tu sa faci cu scriptul asta si nici cum arata structura bazei tale de date dar gandeste-te si la lucrul asta. Un utilizator ar putea trimite ca valoare a $_POST['nume_tabel'] orice vrea el, nu numai ce ai tu definit in select. Si uite cum, face exact ce am facut eu aici numai ca inlocuieste doua chestii, atributul action de la formular, sa trimita spre pagina din site-ul tau care proceseaza formularul, si doi, valoarea din optiunea selectata de el.

Bun, acum sa acopar alte aspecte din primul meu post. Iti ziceam de magic_quotes_gpc. Fac o paranteza, iti explic aici dar sa treci si pe la manual sa te uiti ca PHP-ul e mai mare decat am eu timp si cunostinta sa zic.

In php.ini exista o directiva, magic_quotes_gpc, care daca e pe on, face escape la toate variabilele superglobale, alea de le ziceam mai sus. Adica, daca eu introduc intr-un formular caracterul ' (ghilimea), il voi primi in scriptul care proceseaza formularul valoarea \'. Asta pentru ca ghilimelele sunt periculoase pentru query-uri. Bun, acum daca directiva asta e pe on si eu fac mysql_real_escape_string (functie care face acelasi lucru) o sa fac escape de doua ori, ceea ce e egal cu nici un escape, deci am vulnerabilitate in query.

asa ca mai sus in loc de doar mysql_real_escape_string($nume_tabel) ar trebui:

Cod: Selectaţi tot

     if ( get_magic_quotes_runtime() ) {
         $nume_tabel = stripslashes($nume_tabel);
         $nume_tabel = mysql_real_escape_string($nume_tabel);         
     }


Ok, ar mai fi cate ceva de zis dar sper ca postul asta sa te ajute mai mult ca celalalt.

Avatar utilizator
Amenthes
Senior Member
Mesaje: 1370
Membru din: Lun Dec 12, 2005 8:00 am
Contact:

Mesajde Amenthes » Mar Sep 04, 2007 4:22 am

Hmm, poate ca totusi n-am inteles eu cum trebuie ceea ce vrei tu....

Daca vrei sa se schimbe pagina cand schimbi optiunea din select, deci fara sa mai apesi pe butonul de submit, si vrei sa stii in pagina urmatoare ce optiune ai ales, e mai bine sa faci asa decat ce ti-a facut tie Dreamweaver-ul:

Cod: Selectaţi tot


<select name="nume_tabel" onchange="this.form.submit()">


Avatar utilizator
maniac0man
PHPRomania Supporter
Mesaje: 13
Membru din: Vin Aug 31, 2007 9:30 pm

Mesajde maniac0man » Mar Sep 04, 2007 1:00 pm

Deci vreau sa creez un fel de admin ptr un site magazin virtual !

Vreau sa adaug produse in baza de date , insa nu vreau sa fac 1000 de formular ptr fiecare tabel care in am io in baza de date sa pot adauga shterge etc in el ...

Avatar utilizator
Amenthes
Senior Member
Mesaje: 1370
Membru din: Lun Dec 12, 2005 8:00 am
Contact:

Mesajde Amenthes » Mar Sep 04, 2007 1:08 pm

Am impresia ca tu ai o alta problema. Normalizarea bazei de date. Tu creezi cumva cate un tabel pentru fiecare marca de produs, sau tip? Daca da, cauta pe google despre normalizare. In query-uri rar ar trebui sa iti varieze numele tabelului, ceea ce trebuie sa iti varieze este numele unor campuri din tabel.

http://www.geekgirls.com/databases_from_scratch_3.htm

http://www.informit.com/articles/articl ... 27785&rl=1

http://www.datamodel.org/NormalizationRules.html

http://databases.about.com/od/specificp ... Design.htm

http://en.wikipedia.org/wiki/Database_normalization

Avatar utilizator
maniac0man
PHPRomania Supporter
Mesaje: 13
Membru din: Vin Aug 31, 2007 9:30 pm

Mesajde maniac0man » Mar Sep 04, 2007 1:28 pm

Da eu cream care un tabel ptr fiecare produs !

:oops

mi`a mai zis cieva cu o legatura intre id-uri dintre tabele ! dar la fel ceatza totala !


Înapoi la “PHP Incepători”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 29 vizitatori