norsemanGrey Skrevet 25. januar 2010 Del Skrevet 25. januar 2010 Heisann Jeg prøver å få til en sak med php men er ikke helt ekspert på dette så trenger litt hjelp. Det jeg prøver å få til er å kunne opprette en nye database fra fra en webside. Jeg vil at man skal kunne fylle inne navnet på den nye databasen samt brukernavn og passord til serveren og få sendt disse til en php funksjon som oppretter dabasen. Denne funksjonen har jeg laget. Men jeg vet ikke hvordan jeg skal få kjørt funksjonen fra websiden. Har lest noe om at det ikke er mulig å trigge php funkjoner fra html, m.m. man sender et 'form' (er vel skjema det blir på norsk) til et php script på servere. Menjeg vet ikke hvordan jeg får til dette. Noen som kan hjelpe? Lenke til kommentar
BlueEAGLE Skrevet 25. januar 2010 Del Skrevet 25. januar 2010 (endret) form.html <form action="form_handler.php" method="post"> <input type="text" name="form_field" /> <input type="submit"/> </form> form_handler.php <?php echo $_POST['form_field'].'<br/>'; include('form.html'); //This will show the form again. ?> Ikke testet men det skal ikke være veldig langt unna sannheten. Det viktigste du vil tenke på her er å passordbeskytte sidene som oppretter nye databaser. Dette gjelder både skjemaet og siden som tar seg av selve opprettelsen. Du vil også feilsjekke databasenavnet slik at du ikke forsøker å opprette en database med ugyldig navn eller en som allerede er opprettet. Edit: Dumme forum som ikke godtar som BB-kode Endret 25. januar 2010 av BlueEAGLE Lenke til kommentar
MikkelRev Skrevet 25. januar 2010 Del Skrevet 25. januar 2010 Noe forenklet: html: <input type="text" name="database_name"> php: mysql_query("CREATE DATABASE ".$_POST["database_name"]); Lenke til kommentar
norsemanGrey Skrevet 26. januar 2010 Forfatter Del Skrevet 26. januar 2010 form.html <form action="form_handler.php" method="post"> <input type="text" name="form_field" /> <input type="submit"/> </form> form_handler.php <?php echo $_POST['form_field'].'<br/>'; include('form.html'); //This will show the form again. ?> Ikke testet men det skal ikke være veldig langt unna sannheten. Det viktigste du vil tenke på her er å passordbeskytte sidene som oppretter nye databaser. Dette gjelder både skjemaet og siden som tar seg av selve opprettelsen. Du vil også feilsjekke databasenavnet slik at du ikke forsøker å opprette en database med ugyldig navn eller en som allerede er opprettet. Edit: Dumme forum som ikke godtar som BB-kode[/quote] Takk for svar men er desverre ikke helt med Skal forklare litt nærmere hva jeg har. Under er funksjonen jeg har lagd for å opprette databasen. Tanken er at den skal ligge i en php fil (functions.php) sammen med en rekke andre funksjoner. [code]function dbCreateSiteDatabase($dbUser, $dbPass, $dbName) { //Connect to database server mysql_connect($dbHost, $dbUser, $dbPass) or die(mysql_error()); // Build query to create new database $query = 'CREATE DATABASE ' . $dbName; // Execute query and close connection mysql_query($query) or die(mysql_error()); mysql_close(); } Under er skjemaet som ligger på siden index.php hvor en skal kunne skrive inn brukernavn og passord til serveren, og i tillegg navnet på den nye databasen som skal opprettes. Liknende det du foreslo i form.html. <form name="dbcreate" action="functions.php" methos="post"> Server Username: <input type="text" name="user" /> Server Password: <input type="password" name="password" /> New Database Name: <input type="text" name="name" /> <input type="submit" /> </form> Så jeg trenger altså å få overført variablene og kjørt funksjonen som ligger i functions.php når jeg trykker submit. Litt usikker på hvordan du mente jeg skal få til det med form_handler.php. Er som sagt ganske ny på dette Lenke til kommentar
BlueEAGLE Skrevet 26. januar 2010 Del Skrevet 26. januar 2010 Ok, siden du ikke ser sammenhengen her så skal jeg finne fram den fine teskjeen min. Når du har et skjema som bruker "post"-metoden og tekstfelt i av typen <input type="text" name="user"/> så vil innholdet i tekstboksen havne i superglobalvariabelen $_POST. Du kan da behandle denne med $_POST['user']. Dette burde du ha sett hvis du hadde testet de to kodesnuttene jeg laget. Det neste du vil gjøre er å sjekke om brukernavn og passord er korrekt. Når det gjelder passord så er det generelt sett en god ide å obfuskere dette i databasen. Jeg foretrekker md5sum med brukernavnet som salt. Dette er ikke en fullverdig kryptering, men det vil gjøre at det kreves litt ekstra vilje for å kunne bryte seg inn. Det vil si at når du oppretter brukeren så lagrer du ikke passordet men md5-summen av brukernavnet og passordet. mysql_query("INSERT INTO table (username, password) VALUES ('$username', '".md5($username.$password)."'"); Når du da skal sjekke brukernavnet så utfører du spørringen $result=mysql_query("SELECT * FROM table WHERE username = '$username' AND password='".md5($username.$password)."'"); Når det gjelder å kjøre funksjonen så trenger du å bruke resultatet av overnevnte spørring for å sjekke om brukernavn og passord er korrekt, samt sjekke om databasenavnet er gyldig og at den ikke allerede finnes før du oppretter den og gir de nødvendige tilgangene. Håper det hjelper. Lenke til kommentar
norsemanGrey Skrevet 26. januar 2010 Forfatter Del Skrevet 26. januar 2010 Hehe, ja jeg trenger en teskje noen ganger Hadde forsåvidt lest meg frem til mye av dette og experimentert en del med $_POST, men jeg får det fortsatt ikke til å fungere. Dette med sikkerhet er ikke så viktig enda ettersom dette i første omgang ikke vil ligge ute på nett med kun til bruk for meg. I filen med dbCreateSiteDatabase() funksjonen er det som sagt flere funksjoner liggende etter hverandre. Variablene i $_POST blir vel overført til den bestemte php filen ved at jeg spesifiserer action="functions.php" i skjemaet, men hvordan får jeg kun den spesifikke funksjonen jeg trenger nå til å kjøre? Jeg prøvde med dette i functions.php men til ingen lykke... if (isset($_POST['host'])) { dbCreateSiteDatabase($_POST['host'], $_POST['user'], $_POST['password'], $_POST['name']); } Lenke til kommentar
BlueEAGLE Skrevet 26. januar 2010 Del Skrevet 26. januar 2010 function dbCreateSiteDatabase($dbUser, $dbPass, $dbName){ Denne funksjonen tar tre parametere. Ut i fra navnene å dømme så ville jeg tippe at disse er brukernavn, passord og databasenavn (i den rekkefølgen). Jeg kan ikke se at $dbHost er definert i funksjonen og følgelig så går jeg ut i fra at det er ment at dette er en global. Dette er etter mitt skjønn en veldig dårlig ide. Det jeg tror du burde gjøre er å kaste ut all den koden og starte fra grunn av. For å lage en database så trenger du tre steg. 1: Sjekke at data er riktig 2: Koble til databasetjenesten 3: Lage databasen. Jeg kommer ikke til å gå inn på feilsjekkrutiner her da det er beskrevet en million steder på interwebben. Så steg 2 og 3 er her. mysql_connect('localhost', $_POST['username'], $_POST['password']) or die('Could not connect to the database due to the folloeing error: '.mysql_error()); mysql_create_db($_POST['database']) or die('Could not create database due to the error: '.mysql_error()); Legg merke til hvordan jeg feilsjekker operasjonene mot databasen. Dette gjør at du vil få meningsfulle feilmeldinger når noe går på tryne. Det er derfor jeg alltid legger spørringer (vi kommer dit etterhvert) i en variabel før jeg kjører mysql_query på dem. Da bruker jeg $query="SELECT * FROM table WHERE field LIKE '$value'"; $result=mysql_query($query) or die("The query '<strong>$query</strong>' failed with the error: ".mysql_error()); Det sparer mye frustrasjon og hodekløing. Lenke til kommentar
norsemanGrey Skrevet 27. januar 2010 Forfatter Del Skrevet 27. januar 2010 Takk igjen for svar, jeg har oppgradert skriptet mitt med noen feilmeldinger, men jeg tror ikke du forstår hva det egentlige problemet mitt er her. Funckjonen som lager databasen fungerer for seg selv helt fint (dvs hvis jeg putter funksjonen i en egen fil fyller inn for variablene og kjører det i browseren). Jeg får den bare ikke til å fungere når jeg benytter meg av et skjema for å fylle inn parmaeterene og så kalle funksjonen som ligger i en php fil sammen med flere andre. functions.php function funk1() { ....... } function funk2() { ....... } osv En ting jeg stusser over er at selv om jeg benytter meg av $_POST metoden i skjemaet hvor jeg fyller inn parameterene så er de synlige i URL'en; http://localhost/Template/functions.php?host=localhost&user=root&password=&name=test2 Dette er skjemaet jeg benytter i index.php <form name="dbcreate" action="functions.php" method="post"> Server Host: <input type="text" name="host" /> Server Username: <input type="text" name="user" /> Server Password: <input type="password" name="password" /> New Database Name: <input type="text" name="name" /> <input type="submit" /> </form> Et annet problem er at når jeg trykker på "Submit" så blir functions.php åpnet, men det jeg ønsker er å forbli på den samme siden som skjemaet er. I functions.php prøver jeg denne metoden for å kjøre funksjonen jeg ønsker. if (isset($_POST['host'])) { dbCreateSiteDatabase($_POST['host'], $_POST['user'], $_POST['password'], $_POST['name']); } Deretter kommer selve funksjonen function dbCreateSiteDatabase($dbHost, $dbUser, $dbPassword, $dbName) { //Connect to database server mysql_connect($dbHost, $dbUser, $dbPassword) or die('Could not connect to MySQL server due to following error: ' . mysql_error()); // Build query to create new database $query = 'CREATE DATABASE ' . $dbName; // Execute query and close connection mysql_query($query) or die('Could not create database due to the following error: ' . mysql_error()); mysql_close(); } Lenke til kommentar
norsemanGrey Skrevet 29. januar 2010 Forfatter Del Skrevet 29. januar 2010 Ingen som har noe forslag? Lenke til kommentar
Thomas. Skrevet 29. januar 2010 Del Skrevet 29. januar 2010 (endret) <?php include 'fil der funksjonene ligger'; if(isset($_POST['submit'])) { $host = $_POST['host']; $bruker = $_POST['bruker']; $pass = $_POST['pass']; $db = $_POST['db']; dbCreateSiteDatabase($host, $bruker, $pass, $db); } ?> <form method="post"> host <input type=text name=host> bruker <input type=text name=bruker> pass <input type=text name=pass> dbnavn <input type=text name=db> <input type=submit name=submit> </form> Dette skal fungere. Endret 29. januar 2010 av Thomas. Lenke til kommentar
quantum Skrevet 29. januar 2010 Del Skrevet 29. januar 2010 Et annet problem er at når jeg trykker på "Submit" så blir functions.php åpnet, men det jeg ønsker er å forbli på den samme siden som skjemaet er. Enten legger du skjemaet i functions.php (og kaller den noe annet kanskje) slik at skjemaet poster til seg selv, eller du bruker redirect, eller include, slik som noen alt har foreslått. http://en.wikipedia.org/wiki/Model–view–controller Lenke til kommentar
norsemanGrey Skrevet 29. januar 2010 Forfatter Del Skrevet 29. januar 2010 <?php include 'fil der funksjonene ligger'; if(isset($_POST['submit'])) { $host = $_POST['host']; $bruker = $_POST['bruker']; $pass = $_POST['pass']; $db = $_POST['db']; dbCreateSiteDatabase($host, $bruker, $pass, $db); } ?> <form method="post"> host <input type=text name=host> bruker <input type=text name=bruker> pass <input type=text name=pass> dbnavn <input type=text name=db> <input type=submit name=submit> </form> Dette skal fungere. Takker! Det fungerer veldig bra, men det er fortsatt et lite problem. Det virker som om isset($_POST['submit']) er sann hele tiden. Hvis jeg f.eks. reloader siden med skjemaet etter jeg har opprettet en database får jeg denne feilmeldingen. Can't create database 'test2'; database exists Det virker altså som at alle variablene fortsatt er satt og den prøver å opprette databasen på nytt. Hvordan kan jeg unngå det? Lenke til kommentar
Thomas. Skrevet 29. januar 2010 Del Skrevet 29. januar 2010 (endret) Hvis jeg f.eks. reloader siden med skjemaet etter jeg har opprettet en database får jeg denne feilmeldingen. Can't create database 'test2'; database exists Det virker altså som at alle variablene fortsatt er satt og den prøver å opprette databasen på nytt. Hvordan kan jeg unngå det? Hvorfor skal du unngå det? Fint og få litt info om hva som skjer. Når du oppdaterer etter du har sendt data, blir den sendt på nytt. Du kan unngå det med header(). Endret 29. januar 2010 av Thomas. Lenke til kommentar
norsemanGrey Skrevet 29. januar 2010 Forfatter Del Skrevet 29. januar 2010 Hvis jeg f.eks. reloader siden med skjemaet etter jeg har opprettet en database får jeg denne feilmeldingen. Can't create database 'test2'; database exists Det virker altså som at alle variablene fortsatt er satt og den prøver å opprette databasen på nytt. Hvordan kan jeg unngå det? Hvorfor skal du unngå det? Fint og få litt info om hva som skjer. Når du oppdaterer etter du har sendt data, blir den sendt på nytt. Du kan unngå det med header(). Jo, det et jeg får tilbakemelding er bare flott, men vil bare ikke at den skal forsøke å opprette databasen på nytt. Leste litt på manual til header() men litt usikker på hvordan du mener jeg bør bruke den for å ungå problemet? Lenke til kommentar
Thomas. Skrevet 29. januar 2010 Del Skrevet 29. januar 2010 if(isset($_POST['submit'])) { $host = $_POST['host']; $bruker = $_POST['bruker']; $pass = $_POST['pass']; $db = $_POST['db']; dbCreateSiteDatabase($host, $bruker, $pass, $db); header("Location: XX"); } XX bytter du ut med filens navn. (sti) Lenke til kommentar
norsemanGrey Skrevet 29. januar 2010 Forfatter Del Skrevet 29. januar 2010 if(isset($_POST['submit'])) { $host = $_POST['host']; $bruker = $_POST['bruker']; $pass = $_POST['pass']; $db = $_POST['db']; dbCreateSiteDatabase($host, $bruker, $pass, $db); header("Location: XX"); } XX bytter du ut med filens navn. (sti) Ok, prøve dette header("Location: index.php"); men fikk da denne feilmeldingen Warning: Connot modify header information - header alredy sent by (output started at C:\xampp\htdocs\Template\index.php:12)in C:\xampp\htdocs\Template\index.php on line 17 Lenke til kommentar
Alex Moran Skrevet 29. januar 2010 Del Skrevet 29. januar 2010 omg Søk opp feilmeldingen på Google og du finner raskt svaret. Kanskje tidenes mest stilte spørsmål. Hint: Du prøver å sende headers etter content. Lenke til kommentar
norsemanGrey Skrevet 29. januar 2010 Forfatter Del Skrevet 29. januar 2010 omg Søk opp feilmeldingen på Google og du finner raskt svaret. Kanskje tidenes mest stilte spørsmål. Hint: Du prøver å sende headers etter content. Jeg er som sagt ganske uerfaren med PHP og ser ikke helt sammengenen når jeg leser om dette på sider gjennom google. Det er derfor jeg spør her. Jeg er usikker på hva header() egentlig gjør, men hvis det ikke funker med den er det da en annen metode jeg kan bruke for å forhindre at funksjonen for å opprette en ny database kjører på reload av siden? Lenke til kommentar
Thomas. Skrevet 29. januar 2010 Del Skrevet 29. januar 2010 forhindre at funksjonen for å opprette en ny database kjører på reload av siden? Det er jo derfor du får feil-melding. Så en ny database vil ikke bli opprettet, fordi den finnes fra før. Lenke til kommentar
BlueEAGLE Skrevet 29. januar 2010 Del Skrevet 29. januar 2010 http://php.net/header Allerede i beskrivelsen av funksjonen så er denne feilårsaken diskutert. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå