Avatar billede garant11 Nybegynder
24. september 2012 - 13:32 Der er 14 kommentarer og
1 løsning

Problem med prepared statement mysqli

Hej.

Efter at have læst olebole's Prepared Statements under MySQLI: http://www.eksperten.dk/guide/1480

Ville jeg lige prøve det af men uden held..

Jeg har følgende kode:
$server = "localhost:8081";
$bruger = "root";
$kodeord = "12345";
$db = "test";

$mysqli = new mysqli("$server", "$bruger", "$kodeord", "$db");

if (mysqli_connect_errno()) {
    echo 'Der opstod en fejl ved forbindelsen: ' . mysqli_connect_error();
    exit();



if ($stmt = $mysqli->prepare("SELECT `brugernavn`, `kode` FROM `admins` WHERE `brugernavn` = ? && `kode` = ?")) {

    /* Bind parametre */
    $stmt->bind_param('s', $brugernavn);
    $stmt->bind_param('i', $kode);
       
    /* Sæt værdier på parametrene */
    $brugernavn = $_POST['brugernavn'];
    $kode = $_POST['kode'];

    /* Eksekver forespørgslen */
    $stmt->execute();

    /* Bind resultatet */
    $stmt->bind_result($brugernavn, $kode);

    setcookie("brugernavn", "$brugernavn", time()+3600);
    setcookie("kodeord", "$kode", time()+3600);
    header("location:data.php");

} else {
    /* Der er opstået en fejl */
    echo 'Der opstod en fejl i erklæringen: ' . $mysqli->error;
}

    /* Luk statement */
    $stmt->close();

}



Når jeg prøver at submit brugernavn og kode, bliver den ved med at  venter på localhost.

Er der nogen som vil fortælle mig, hvad jeg gør galt?
Avatar billede olebole Juniormester
24. september 2012 - 13:49 #1
<ole>

Argumenterne skal bindes i ét hug:

    /* Bind parametre */
    $stmt->bind_param('si', $brugernavn, $kode);

Men du får aldrig lukket dit statement, hvis din prepare sætning lykkes. Flyt i stedet lukningen op før din location header  *o)

/mvh
</bole>
Avatar billede garant11 Nybegynder
24. september 2012 - 14:04 #2
Browseren "venter på localhoster" stadigvæk, og efter cirka et minut, stopper den med at indlæse og forbliver på login.php siden. Men tak for tippet med lukningen.. :-)

Jeg har tjekket for stavefejl op til flere gange nu og tjekket at begge formular felter bliver sendt videre..

Forresten, rigtig god begynder guide du har lavet med Prepared Statements under MySQLI.. ;-)
Avatar billede olebole Juniormester
24. september 2012 - 14:17 #3
Du har en 'Tuborg' fejl. Sådan skal koden se ud:

$server = "localhost:8081";
$bruger = "root";
$kodeord = "12345";
$db = "test";

$mysqli = new mysqli("$server", "$bruger", "$kodeord", "$db");

if (mysqli_connect_errno()) {
    echo 'Der opstod en fejl ved forbindelsen: ' . mysqli_connect_error();
    exit();
}


if ($stmt = $mysqli->prepare("SELECT `brugernavn`, `kode` FROM `admins` WHERE `brugernavn` = ? && `kode` = ?")) {

    /* Bind parametre */
    $stmt->bind_param('si', $brugernavn, $kode);
       
    /* Sæt værdier på parametrene */
    $brugernavn = $_POST['brugernavn'];
    $kode = $_POST['kode'];

    /* Eksekver forespørgslen */
    $stmt->execute();

    /* Bind resultatet */
    $stmt->bind_result($brugernavn, $kode);

    setcookie("brugernavn", "$brugernavn", time()+3600);
    setcookie("kodeord", "$kode", time()+3600);

    /* Luk statement */
    $stmt->close();
    header("location:data.php");

} else {
    /* Der er opstået en fejl */
    echo 'Der opstod en fejl i erklæringen: ' . $mysqli->error;
}
Avatar billede olebole Juniormester
24. september 2012 - 14:19 #4
Din første IF afsluttede du først efter hele koden. Hvis databaseforbindelsen lykkes - og første IF derfor ikke bliver afviklet - vil resten af koden derfor heller ikke blive afviklet  *o)
Avatar billede garant11 Nybegynder
24. september 2012 - 14:29 #5
Hehe, ja rigtig nok. Men det hjalp desværre ikke. Den kører stadig, uden der sker noget.

Her er lige lidt info om MySQLI fra phpinfo():
mysqli

MysqlI Support:enabled
Client API library version: mysqlnd 5.0.8-dev - 20102224 - $Revision: 310735 $
Active Persistent Links: 0
Inactive Persistent Links: 0
Active Links: 0

Directive    Local Value    Master Value
mysqli.allow_local_infile    On    On
mysqli.allow_persistent    On    On
mysqli.default_host    no value    no value
mysqli.default_port    3306    3306
mysqli.default_pw    no value    no value
mysqli.default_socket    MySQL    MySQL
mysqli.default_user    no value    no value
mysqli.max_links    Unlimited    Unlimited
mysqli.max_persistent    Unlimited    Unlimited
mysqli.reconnect    Off    Off
Avatar billede garant11 Nybegynder
24. september 2012 - 14:52 #6
Fik løst problemet, tror jeg.. Jeg prøvede at fjerne port nummeret ved localhost og vupti, så kom jeg videre. Mærkeligt at den ikke forstår portnummeret fordi min side ligger på http://localhost:8081/
Ved du hvorfor ole og vil du lægge et svar ud? Du har været en god hjælp...
Avatar billede garant11 Nybegynder
24. september 2012 - 15:03 #7
Tænkte på om du kunne fortælle mig om jeg har forstået din guide ordenligt.


// if = hvis der er findes et eller flere records, hent og print dem ud
if ($stmt = $mysqli->prepare('SELECT `fornavn`, `efternavn` FROM `tabel` WHERE `id` > ?')) {

    /* Bind parametre */
    $stmt->bind_param('i', $id);

    /* Sæt værdier på parametrene */
    $id = $_GET['id'];

    /* Eksekver forespørgslen */
    $stmt->execute();

    /* Bind resultatet */
    $stmt->bind_result($fornavn, $efternavn);

    /* Hent rækker og udskriv data */
    while ($stmt->fetch()) {
        echo $fornavn . ' ' . $efternavn . '<br>';
    }

    /* Luk statement */
    $stmt->close();

// else = hvis ikke der findes nogen records, gør det her
} else {
    /* Der er opstået en fejl */
    echo 'Der opstod en fejl i erklæringen: ' . $mysqli->error;
}
Avatar billede Slettet bruger
24. september 2012 - 15:26 #8
Der er forskel på webserveren og MySQL serveren og derfor er det kun din webserver som kører på port 8081, hvorimod din MySQL server kører på port 3306.

Desuden mener jeg at hvis du skulle forbinde til en MySQL server der kører på en anden port end 3306, så skal det angives I mysqli::__construct's 5 parameter, men må indrømme jeg ikke er 100% sikker på den påstand.
Avatar billede garant11 Nybegynder
24. september 2012 - 15:32 #9
roxki:
Aha, okay.. Det vil jeg lige tjekke op på.. :-)
Avatar billede olebole Juniormester
24. september 2012 - 16:44 #10
@roxki: Begge dele er helt korrekt  *o)

@garant11: Koden i #7 er korrekt. I den foregående opdagede jeg ikke lige, du manglede at fetch'e, før du prøvede at bruge resultatet til kagen  =)
Avatar billede garant11 Nybegynder
24. september 2012 - 16:54 #11
Okay.. Mange tak ole.. Nu vi taler om at fetch'e, er det følgende eksempel den rette metode hvis man kun skal fetch'e 1 enkelt række?

...

$stmt->bind_result($brugernavn); // Bind resultatet

$stmt->fetch(); // Hent værdierne

echo $brugernavn;
Avatar billede olebole Juniormester
24. september 2012 - 17:07 #12
Ja, den er helt korrekt  =)

Sorry, det er ikke for at spille arrogant, men jeg var lige optaget af at få din kode rettet til. Jeg har bemærket din ros og tak, hvilket absolut er apprecieret!

Jeg samler ikke point, så du lægger bare selv et svar og accepterer det, så tråden lukkes. Men tak for tilbudet  =)
Avatar billede garant11 Nybegynder
24. september 2012 - 17:18 #13
Awesome. :-)

Hehe, helt iorden.
Avatar billede olebole Juniormester
24. september 2012 - 17:29 #14
PS: Næste gang du har problemer, så prøv at echo'e nogle små sætninger som: "Jeg står lige inden første IF.", "Lige indenfor første IF.", "Lige efter første IF.", "Lige inden anden IF." - osv.

Du kan også prøve at skrive dine POST-variabler ud med:

var_dump($_POST);

Der kunne jo mangle en variabel - eller feltnavnet kan være 'sdavøt' forkert  *o)

echo $mysqli->error;

- og:

echo $stmt->error;

- kan du også prøve 'på udsatte steder'.

Læs også gerne denne guide om sikrere fejlmeddelelser  =)
Avatar billede garant11 Nybegynder
25. september 2012 - 12:15 #15
Ahaa. Cool... :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester