Avatar billede starf Nybegynder
08. februar 2013 - 11:04 Der er 31 kommentarer og
1 løsning

php og mysqli

jeg forsøger at få mysqli til at virke ud fra guiden her fra eksperten. men af en eller anden grund virker min kode ikke, jeg får bare en blank skærm, og ingen fejl.

Nogle der kan se hvad jeg gør galt?

http://pastebin.com/pXaWQLTD
Avatar billede serverin Praktikant
08. februar 2013 - 13:56 #1
i linje 7
if ($stmt = $mysqli->prepare('INSERT INTO `elev` (fornavn, efternavn, mobil, adresse_vej, adresse_by, adresse_postnr, email, birthday, holdid, type, status,rate1, rate2, bog, syg, dato) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)')) {
dette: (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) skal se således ud: ('?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?')
dvs du skal sætte ' ' omkring de steder som er tekst strenge..
altså et eksempel ville være; $query = "INSERT INTO `people` (`id`,`name`,`age`) VALUES (NULL,'Mitch','25');";



det er lige umiddelbart mit bud, men ellers kig på dette: http://php.net/manual/en/mysqli.error.php
Avatar billede arne_v Ekspert
08. februar 2013 - 14:06 #2
@#1

Nej. Man saetter ikke '' omkring strenge naar man bruger prepared statement.
Avatar billede arne_v Ekspert
08. februar 2013 - 14:09 #3
Hvad returnerer execute?

Hvad indeholder $error?
Avatar billede starf Nybegynder
08. februar 2013 - 15:00 #4
med chance for at virke dum, hvordan kan jeg se hvad execute returnere, jeg får som sagt ike andet end en hvid side, når jeg køre min kode.

med echo $error;

får jeg intet på siden?
Avatar billede arne_v Ekspert
08. februar 2013 - 15:22 #5
Test paa den retur vaerdi og udskriv hvis den fejler.
Avatar billede arne_v Ekspert
08. februar 2013 - 15:24 #6
Men er du sikker paa at koden ikke virker?

Du udskriver saa vidt keg kan heller ikke noget ved success!?!?
Avatar billede starf Nybegynder
08. februar 2013 - 15:24 #7
bare som info, køre PHP Version 5.2.17, via surftown, men såvidt jeg kan se understøtter den fint mysqli
Avatar billede michael_stim Ekspert
08. februar 2013 - 15:25 #8
Bare lige ved et hurtigt kig:

$one = '1';
$zero = '0';

Til:

$one = 1;
$zero = 0;
Avatar billede starf Nybegynder
08. februar 2013 - 15:26 #9
"Men er du sikker paa at koden ikke virker?

Du udskriver saa vidt keg kan heller ikke noget ved success!?!?"

nej det har du ret i, men jeg kan se der ikke kommer noget ind i min database?

der ud over kan jeg se den mail der står i koden der skal sendes ikk e bliver sendt, og jeg ej heller bliver vidre sendt til tak siden.

hvis jeg tilføjer et echo "det virker"; efter $stmt->close();, så bliver den del heller ikke skrevet.
Avatar billede starf Nybegynder
08. februar 2013 - 15:29 #10
michael_stim >

tak, men det er ikke det der giver mig problemet. men kan godt se du har ret i at det skal være

$one = 1;
$zero = 0;

så tak :)
Avatar billede starf Nybegynder
08. februar 2013 - 15:37 #11
tilføjer jeg en

echo "1"; før min if kode

og en echo "2"; efter den lukker forbindelsen til sql, er det kun echo 1 der bliver kørt, er som om den ikke får kørt selve sql koden
Avatar billede olebole Juniormester
08. februar 2013 - 16:39 #12
<ole>

Du har i hvertfald rod i dine variabler. Hvis vi tager de første syv, ser de sådan ud:

fornavn, efternavn, mobil, adresse_vej, adresse_by, adresse_postnr, email

$fnavn, $enavn, $mobil1, $email, $adresse_by, $adresse_vej,$adresse_postnr

Det er der vist ikke meget overensstemmelse i  =)

Derudover bør du fortsætte det spor, arne_v ledte dig ind på:

$stmt->bind_param(... ... ...);
echo $mysqli->error . '<br>';

// og:

$exec_result = $stmt->execute();
echo '$exec_result: ' . $exec_result . '<br>';
echo $mysqli->error . '<br>';

/mvh
</bole>
Avatar billede starf Nybegynder
08. februar 2013 - 16:44 #13
fornavn, efternavn, mobil, adresse_vej, adresse_by, adresse_postnr, email

det henviser da til datatabellen

$fnavn, $enavn, $mobil1, $email, $adresse_by, $adresse_vej,$adresse_postnr

dette henviser da til hvad jeg sat mine post resultater som, eller misforstår jeg det helt her?
Avatar billede olebole Juniormester
08. februar 2013 - 16:52 #14
Nej, det henviser ikke til det, du tror. Prøv at tjekke rækkefølgen i #12. Rækkefølgen i de to linjer hænger ikke sammen  =)
Avatar billede olebole Juniormester
08. februar 2013 - 16:53 #15
$email sætter du ind i feltet 'adresse_vej' ... osv
Avatar billede starf Nybegynder
08. februar 2013 - 17:02 #16
if ($stmt = $mysqli->prepare('INSERT INTO `elev` (fornavn, efternavn, mobil, adresse_vej, adresse_by, adresse_postnr, email, birthday, holdid, type, status,rate1, rate2, bog, syg, dato) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)')) {


$stmt->bind_param('sssssssiiiiiiiii', $fnavn, $enavn, $mobil1, $adresse_vej, $adresse_by, $adresse_postnr, $email, $birthday, $hold, $one, $one, $zero, $zero, $zero, $zero, $stamp_now);

nu er det rette til så det kommer i den rigtig række følge. når der står valus(?, ?,?...) der vil man jo i normal sql bre have sine $værdier, er det ikke muligt bare at gøre det sådan med mysqli, eller så mister man måske den sikkerhed det giver?
Avatar billede olebole Juniormester
08. februar 2013 - 17:11 #17
Jo, det kan du sagtens gøre - og ja, det ville være tåbeligt, da det ville fjerne fordelene ved prepared statements.

Hvad fik du ud af at echo'e resultatet af execute samt evt. fejl?
Avatar billede olebole Juniormester
08. februar 2013 - 17:13 #18
Er du i øvrigt sikker på, $birthday er et tal?
Avatar billede starf Nybegynder
08. februar 2013 - 17:22 #19
birthday er en dato, min gamle sql kode som virker perfekt, er bare lavet sådan her:

$sql="INSERT INTO elev (fornavn, efternavn, mobil, adresse_vej, adresse_by, adresse_postnr, email, birthday, holdid, type, status,rate1, rate2, bog, syg, dato)
VALUES
('$fnavn','$enavn','$mobil1','$adresse_vej','$adresse_by','$adresse_postnr','$email','$birthday','$hold','1','1','0','0','0','0',NOW())";

jeg fik ikke rigtig nogen fejl, sidder og roder med om det er muligt at slå php fejl til på surftown, går ud fra det er derfor jeg bare får en hvid side og ikke en fejl kode.
Avatar billede olebole Juniormester
08. februar 2013 - 17:26 #20
Hvis $birthday er en dato, skal du nok ikke angive den som integer, når du binder parametre  *o)

Ja, det er sikkert fint at få Surftown til at slå fejlmeddelelser til ... specielt, når du åbenbart ikke selv gider gøre noget for at finde dine fejl
Avatar billede starf Nybegynder
08. februar 2013 - 17:51 #21
er nok ikke fordi jeg ikke gider, men nærmere ikke fatter det.
Avatar billede olebole Juniormester
08. februar 2013 - 18:22 #22
Nej, i så fald er det måske, fordi du ikke gider informere, når der er noget, du ikke fatter - og så er det tæt på umuligt at hjælpe.

Jeg viste dig i #12, hvordan du kan udskrive de ting omkring udskrivning af fejl og resultat af execute, arne_v foreslog - og som du skrev, du ikke forstod. Din respons på det: Larmende tavshed!

I #17 spørger jeg: "Hvad fik du ud af at echo'e resultatet af execute samt evt. fejl?". Din response på det: Igen larmende tavshed.

Hvis du ikke forstår, må du spørge. Hvis du forstår, må du oplyse, hvad der blev skrevet ud
Avatar billede starf Nybegynder
08. februar 2013 - 18:26 #23
syntes jeg skrev jeg intet output fik på det, har sat det ind sådan her?.

    /* Eksekver forespørgslen */
    $exec_result = $stmt->execute();
    echo '$exec_result: ' . $exec_result . '<br>';
    echo $mysqli->error . '<br>';

    /* Luk statement */
    $stmt->close();
Avatar billede olebole Juniormester
08. februar 2013 - 18:38 #24
Prøv denne kode (vent med mail):

<?php
error_reporting(E_ALL);
include 'drive_con.php';
?>

<?php
if ($stmt = $mysqli->prepare('INSERT INTO `elev` (fornavn, efternavn, mobil, adresse_vej, adresse_by, adresse_postnr, email, birthday, holdid, type, status,rate1, rate2, bog, syg, dato) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)')) {

    /* Bind parametre */
    $stmt->bind_param('ssssssssiiiiiiii', $fnavn, $enavn, $mobil1, $adresse_vej, $adresse_by, $adresse_postnr, $email, $birthday, $hold, $one, $one, $zero, $zero, $zero, $zero, $stamp_now);
   
    echo $mysqli->error . '<br>';
   
    /* Sæt værdier på parametrene */
    $fnavn = $_POST['fnavn'];
    $enavn = $_POST['enavn'];
    $mobil1 = $_POST['mobil1'];
    $email = $_POST['email'];
    $adresse_by = $_POST['adresse_by'];
    $adresse_vej = $_POST['adresse_vej'];
    $adresse_postnr = $_POST['adresse_postnr'];
    $birthday = isset($_REQUEST["birthday"]) ? $_REQUEST["birthday"] : "";
    $hold = $_POST['hold'];
    $stamp_now = time();
    $one = 1;
    $zero = 0;
    /* Eksekver forespørgslen */
    $exec_result = $stmt->execute();
   
    echo '$exec_result: ' . $exec_result . '<br>';
    echo $mysqli->error . '<br>';


    /* Luk statement */
    $stmt->close();
   
    echo 'Øjensynlig succes!';
} else {
    /* Der er opstået en fejl */
    echo 'Der opstod en fejl i erklæringen: ' . $mysqli->error;
}
$mysqli->close();
?>

- og slet det, jeg har markeret med rødt, når/hvis du har fået koden til at virke
Avatar billede starf Nybegynder
08. februar 2013 - 19:04 #25
Tak det virker med det samme.

smider du et svar?
Avatar billede starf Nybegynder
08. februar 2013 - 19:05 #26
forresten skal en dato med now() være en string? når jeg angiver typen?
Avatar billede starf Nybegynder
08. februar 2013 - 19:08 #27
ændre jeg time() til now() så holder det op med at virke.

dato i tabellen er sat som en "date" type. hvis jeg ikke kan bruge now() for at få en dato i dette format. 2013-02-02, hvordan gør jeg så?
Avatar billede starf Nybegynder
08. februar 2013 - 19:50 #28
ok now() skal ind i values, da det er en mysql del. så fjerner jeg $stampnow fra param, da den nu ikke længere skal tage værdien fra den, men bruger den der bliver angivet med now, og sætter typen til string. så det ser sådan her ud, burde det ikke være rigtigt?

($stmt = $mysqli->prepare('INSERT INTO `elev` (fornavn, efternavn, mobil, adresse_vej, adresse_by, adresse_postnr, email, birthday, holdid, type, status,rate1, rate2, bog, syg, dato) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, now())')) {

    /* Bind parametre */
    $stmt->bind_param('ssssssssiiiiiis', $fnavn, $enavn, $mobil1, $adresse_vej, $adresse_by, $adresse_postnr, $email, $birthday, $hold, $one, $one, $zero, $zero, $zero, $zero);
Avatar billede olebole Juniormester
08. februar 2013 - 20:22 #29
Ja, NOW() er en MySQL funktion - som vil udløse en fejl, når den bliver brught som en PHP-funktion. PHP's time() giver et timestamp, som naturligvis ikke kan bruges, når det er en dato, der ønskes  =)

Bemærk, at når du sætter error_reporting som vist, slår du fejlmeddelelser til på dokumentplan. Læs evt. denne guide om sikrere fejlhåndtering.

Jeg samler ikke point, men Arne kom med meget vigtige pointer, før jeg blandede mig  =)
Avatar billede starf Nybegynder
08. februar 2013 - 21:56 #30
Jeg takker for tolmodigheden og hjælpen... arne må smide et svar så.

tak for linket til guiden, læser den med det samme.
Avatar billede olebole Juniormester
08. februar 2013 - 22:02 #31
Selvtak  *o)
Avatar billede arne_v Ekspert
10. februar 2013 - 21:04 #32
svar fra mig - selvom jeg jo kun var med i starten
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
Kurser inden for grundlæggende programmering

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