Avatar billede Hans1 Praktikant
02. juni 2012 - 14:56 Der er 17 kommentarer og
1 løsning

Hjælp til database udtræk

Hej

Jeg har prøvet at skrive følgende kode men den viser blank side når jeg udfører den. Jeg skal bruge koden til at ligge de forskellige kolonner i en session.

Problemer opstår højst sandsynligt i de to linjer:


$row = $stmt->fetch();
return ($row);


Hele koden:

<?php
    function fetchUserDetails($username)
    {
            $mysqli = new mysqli("localhost", "brugernavn", "adgangskode", "tabel");

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

            if ($stmt = $mysqli->prepare('SELECT `username`, `firstname`, `lastname`, `email` FROM `users` WHERE `username` = ? LIMIT 1'))
            {
                $stmt->bind_param('s', $username);

                $stmt->execute();

                $row = $stmt->fetch();
               
                return ($row);

                $stmt->close();
            }
            else
            {
                echo 'Der opstod en fejl i erklæringen: ' . $mysqli->error;
            }
    }

    $userdetails = fetchUserDetails("ssf");
    echo $userdetails["firstname"];
?>
Avatar billede olebole Juniormester
02. juni 2012 - 17:14 #1
<ole>

Enten skal du (efter STATEMENT->execute) bruge STATEMENT->bind_result - eller STATEMENT->get_result, efterfulgt af RESULT->fetch_array.

Prøv, om du selv kan finde ud af det på baggrund af eksemplerne. Ellers tager vi den sammen her i tråden  =)

/mvh
</bole>
Avatar billede olebole Juniormester
02. juni 2012 - 17:18 #2
Jeg erkender, det måske ikke er krystalklart forklaret i min guide, men kik under "Eksempel på en SELECT forespørgsel, hvor id er større en værdi, hentet fra dokumentets URL". Her binder jeg også resultatet til to variabler: $fornavn og $efternavn  =)
Avatar billede Hans1 Praktikant
02. juni 2012 - 17:45 #3
Når jeg prøver med kommandoen: get_result
Så får jeg følgende fejl: Fatal error: Call to undefined method mysqli_stmt::get_result()

Jeg kan sagens få det til at virke hvis jeg bruger bind funktionen.
Men formålet med det nu er at gøre brug af denne kode:


$userdetails = fetchUserDetails("ssf");
echo $userdetails["firstname"];


Så jeg i sidste ende vil lave et session object med henholdsvis username, firstname, lastname samt email så der ikke bliver lavet opslag mod databasen ved hvert sideskift.
Avatar billede olebole Juniormester
02. juni 2012 - 17:56 #4
"Når jeg prøver med kommandoen: get_result
Så får jeg følgende fejl"
>> Så må du lave en eller anden fejl, jeg ikke kan se her  =)

Du kan bide resultatet og returnere et array (evt. et associativt array):

            if ($stmt = $mysqli->prepare('SELECT `username`, `firstname`, `lastname`, `email` FROM `users` WHERE `username` = ? LIMIT 1'))
            {
                $stmt->bind_param('s', $username);

                $stmt->execute();
               
                $stmt->bind_result($username, $firstname, $lastname, $email);

                $stmt->fetch();

                $stmt->close();
                $mysqli->close();
               
                return array('username'=>$username, 'firstname'=>$firstname, 'lastname'=>$lastname, 'email'=>$email);
            }

- men husk at lukke dit statement og din forbindelse, før du returnerer. Når først, du returnerer, springer du ud af funktionen, så resten ikke afvikles  *o)
Avatar billede olebole Juniormester
02. juni 2012 - 18:03 #5
PS: Hvis du har skrevet noget i stil med:

$stmt->execute();
$stmt->close();
$result = $stmt->get_result();

- er dit statement ikke eksisterende, når du prøver at kalde metoden get_result. Det kunne være årsagen til den fejl, du omtalte. Ellers ved jeg ikke, hvordan den skulle opstå
Avatar billede vagnk Juniormester
02. juni 2012 - 18:38 #6
Min sql syntax-checker siger:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? LIMIT 1' at line 1

Hvad laver det spørgsmålstegn?
Avatar billede olebole Juniormester
02. juni 2012 - 19:03 #7
Så viser du vist ikke den kode, du tester på. Denne linje:

if ($stmt = $mysqli->prepare('SELECT `username`, `firstname`, `lastname`, `email` FROM `users` WHERE `username` = ? LIMIT 1'))

- giver næppe fejlen i #6
Avatar billede vagnk Juniormester
02. juni 2012 - 19:24 #8
Bvadr, jeg fik ikke stmt med. Det var:
SELECT * FROM `users` WHERE `username` = ? LIMIT 1

Tabellen var oprettet med 1 kolonne username. Checket i phpMyAdmin.
Avatar billede olebole Juniormester
02. juni 2012 - 19:27 #9
Den kommando kan jeg heller ikke se fejlen i
Avatar billede olebole Juniormester
02. juni 2012 - 19:37 #10
Når jeg tester med denne tabel:

CREATE TABLE IF NOT EXISTS `users` (
  `username` varchar(50) COLLATE utf8_danish_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;

INSERT INTO `users` (`username`) VALUES
    ('bla'),
    ('blabla'),
    ('foo'),
    ('bar');

- og denne kode:

<?php
function fetchUserDetails($username) {
        $mysqli = new mysqli("localhost", "root", "", "test_db");

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

        if ($stmt = $mysqli->prepare('SELECT * FROM `users` WHERE `username` = ? LIMIT 1')) {
            $stmt->bind_param('s', $username);

            $stmt->execute();
           
            $stmt->bind_result($username);

            $stmt->fetch();

            $stmt->close();
            $mysqli->close();
           
            return array('username'=>$username);
        } else {
            echo 'Der opstod en fejl i erklæringen: ' . $mysqli->error;
        }
}

$userdetails = fetchUserDetails('bla');
var_dump($userdetails);
?>

- får jeg helt som forventet returneret:

array
  'username' => string 'bla' (length=3)
Avatar billede olebole Juniormester
02. juni 2012 - 19:44 #11
- og denne kode returnerer det samme:

function fetchUserDetails($username) {
        $mysqli = new mysqli("localhost", "root", "", "test_db");

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

        if ($stmt = $mysqli->prepare('SELECT * FROM `users` WHERE `username` = ? LIMIT 1')) {
            $stmt->bind_param('s', $username);

            $stmt->execute();
           
            $res = $stmt->get_result();

            $row = $res->fetch_assoc();
           
            $res->free();
            $stmt->close();
            $mysqli->close();
           
            return $row;
        } else {
            echo 'Der opstod en fejl i erklæringen: ' . $mysqli->error;
        }
}

$userdetails = fetchUserDetails('bla');
var_dump($userdetails);
Avatar billede Hans1 Praktikant
02. juni 2012 - 20:09 #12
Nu har jeg prøvet med din kode i #11 og jeg får igen følgende fejl: Fatal error: Call to undefined method mysqli_stmt::get_result()

Kan dette skyldes webhotellet?
Avatar billede vagnk Juniormester
02. juni 2012 - 20:35 #13
Ole:
Hvad får du hvis tabellen er tom?
Avatar billede olebole Juniormester
02. juni 2012 - 20:46 #14
@vagnk: Jeg har ikke prøvet, men #11 bør returnere null - og #10 bør returnere et associativt array, hvor elementet username er null.

@Stefan1: Ja, det skyldes webhotellet:

"Please note that this method requires the mysqlnd driver. Othervise you will get this error: Call to undefined method mysqli_stmt::get_result()".
- php.net
Avatar billede Hans1 Praktikant
02. juni 2012 - 21:48 #15
Okay tak. Jeg Må kontakte webhosten.
Avatar billede olebole Juniormester
02. juni 2012 - 22:00 #16
@vagnk: Sorry, jeg begik en fejl i #7. Jeg læste det, som om det var Stefan, der havde skrevet #6  =)

Der er tale om Prepared Statements under MySQLI (I for 'improved'). Spørgsmålstegnet er en placeholder for en parameter, som bindes til udtrykket før eksekvering.

Parametriserede kald gør som bekendt, at SQL-kommandoen ikke er strikket sammen af strenge med mere eller mindre usikkert ophav (= væsentligt forbedret sikkerhed). Samtidig bliver flere på hinanden følgende, ens kald (men med forskellige parameterværdier) afviklet væsentligt hurtigere  *o)
Avatar billede olebole Juniormester
02. juni 2012 - 22:01 #17
#15: Ja, det er nok en god idé  =)
Avatar billede Hans1 Praktikant
16. juni 2012 - 20:24 #18
Svar.
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