Avatar billede Klaphattens Novice
27. august 2012 - 10:50 Der er 19 kommentarer og
1 løsning

Omskriv en mysql_fetch_array($result) til MySQLi

Jeg har prøvet at omskrive:

$result = mysql_query("SELECT id, navn, stilling, rolle FROM liste WHERE userid = '$userid' AND postnr = '$postnr'") or die(mysql_error());
  while ($row = mysql_fetch_array($result)) {

  }


Til:


$stmt = $mysqli->prepare('SELECT id, navn, stilling, rolle FROM liste WHERE userid = ? AND postnr = ?');
         
$stmt->bind_param('ii', $userid, $postnr); 
$stmt->execute();
$stmt->bind_result($id, $navn, $stilling, $rolle);
  while ($row = $stmt->fetch_array(MYSQLI_BOTH)) {

  }
$stmt->close();


Men jeg får denne fejl i denne linje:

Fatal error: Call to undefined method mysqli_stmt::fetch_array() in C:\xampp\htdocs\valg\valgliste.php on line 70

while ($row = $stmt->fetch_array(MYSQLI_BOTH)) {


Jeg har været inde og læse på flere sider om fetch_array og mysqli samt problemet jeg har. men uanset hvad jeg gør får jeg samme fejl. så nu er jeg nød til at søge hjælp her ;)
Avatar billede erikjacobsen Ekspert
27. august 2012 - 11:44 #1
Du skal bare

  while ($stmt->fetch()) {
        print $id.$navn.$stilling.$rolle;
    }
Avatar billede Klaphattens Novice
27. august 2012 - 13:31 #2
Se det virker så.
Men jeg får et problem inde i min while-løkke.
Jeg har efterfølgende prøvet at sende de data jeg får videre til en anden tabel:


$stmt = $mysqli->prepare('SELECT id, navn, stilling, rolle FROM liste WHERE userid = ? AND postnr = ?'); 
$stmt_inner = $mysqli->prepare('INSERT INTO valg (id, navn, stilling, rolle, bruger, postnr) VALUES(?,?,?,?,?,?)');

$stmt->bind_param('ii', $userid, $postnr);
$stmt->execute();
$stmt->bind_result($id, $navn, $stilling, $rolle);
  while ($row = $stmt->fetch_array(MYSQLI_BOTH)) {                             
  $stmt_inner->bind_param('isssii', $id, $navn, $stilling, $rolle, $userid, $postnr);
  $stmt_inner->execute();
  }

$stmt_inner->close();
$stmt->close();


Den finder alle data, men den sender dem ikke til database. Hvis jeg bare udskriver dem, kommer den fineste liste.

Hvordan kan det være?
Avatar billede Klaphattens Novice
27. august 2012 - 14:03 #3
Kopierede fra det forkerte dokument.
Min while er som du skrev før:
while ($stmt->fetch()) {

og ikke:
while ($row = $stmt->fetch_array(MYSQLI_BOTH)) { 

Men resten er som det står.
Avatar billede olebole Juniormester
27. august 2012 - 15:14 #4
<ole>

For forståelsens skyld: fetch_array ligger ikke på Statement objektet, men på Result:

$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_array(MYSQLI_ASSOC)) { 

- og lad være med at bruge MYSQLI_BOTH, hvisa du ikke skal bruge begge.

Det, du nu bruger, bør udfra beskrivelsen fungere fint

/mvh
</bole>
Avatar billede olebole Juniormester
27. august 2012 - 15:16 #5
PS: og ved brug af fetch_array, binder man ikke resultatet til variabler. Det gøres kun inden brug af fetch
Avatar billede Klaphattens Novice
27. august 2012 - 15:37 #6
MYSQLI_BOTH var også bare fordi jeg prøvede nogle af alle de forslag jeg kunne finde. Men de hjalp jo heller ikke.

Det med fetch skal jeg huske.

Men det virker stadig ikke, jeg kan heller ikke se nogle fejl, men den sender intet til databasen.
Jeg er da ved at få grå hår på toppen.
Avatar billede olebole Juniormester
27. august 2012 - 15:52 #7
Prøv at echo'e dine variabler i stedet for at indsætte dem. Hvad får du ud af det?

Prøv evt. også  med echo $stmt->error; på passende steder
Avatar billede Klaphattens Novice
27. august 2012 - 16:10 #8
Når jeg echo'er i stedet for at indsætte dem, kommer der den fineste liste med alle de data jeg gerne vil have indsat.

Hvis jeg sætter en fejl tjek ved under min $stmt_inner->execute();
Så får jeg denne fejl: Commands out of sync; you can't run this command now
Avatar billede olebole Juniormester
27. august 2012 - 16:33 #9
Så prøv noget à la:

$stmt = $mysqli->prepare('SELECT id, navn, stilling, rolle FROM liste WHERE userid = ? AND postnr = ?'); 
$stmt_inner = $mysqli->prepare('INSERT INTO valg (id, navn, stilling, rolle, bruger, postnr) VALUES(?,?,?,?,?,?)');

$stmt->bind_param('ii', $userid, $postnr);
$stmt->execute();
$res = $stmt->get_result();
$a = array();
while ($row = $res->fetch_array(MYSQLI_ASSOC)) {                             
    $a[] = row;
}
$res->free();
$stmt->close();

foreach ($a as $row) {
    $stmt_inner->bind_param('isssii', $row['id'], $row['navn'], $row['stilling'], $row['rolle'], userid, $postnr);
    $stmt_inner->execute();
}
$stmt_inner->close();
Avatar billede olebole Juniormester
27. august 2012 - 16:34 #10
while ($row = $res->fetch_array(MYSQLI_ASSOC)) {                             
    $a[] = $row;
}
Avatar billede Klaphattens Novice
27. august 2012 - 17:05 #11
Yes mand.... Du er for sej ole.
Men jeg forstår stadig ikke hvorfor det andet ikke virkede.
Har du en forklaring på det.

Men 1000 tak.
Kan se at i 2 der har hjulpet ikke samler point. men hvis i alligevel gerne vil have dem så smid et svar ellers lukker jeg senere i aften :)
Avatar billede olebole Juniormester
27. august 2012 - 21:02 #12
Jeg er ikke selv løbet ind i problemet og har ikke forsøgt at genskabe det. Jeg formoder dog, det bunder i, at variablerne $id, $navn, $stilling og $rolle er bundne til dit statement $stmt og derfor ikke kan bruges af $stmt_inner.

Hvis det er korrekt, vil dette også kunne gøre det - og med en løkke mindre:

$stmt = $mysqli->prepare('SELECT id, navn, stilling, rolle FROM liste WHERE userid = ? AND postnr = ?'); 
$stmt_inner = $mysqli->prepare('INSERT INTO valg (id, navn, stilling, rolle, bruger, postnr) VALUES(?,?,?,?,?,?)');

$stmt->bind_param('ii', $userid, $postnr);
$stmt->execute();
$res = $stmt->get_result();

while ($row = $res->fetch_array(MYSQLI_ASSOC)) {                             
    $stmt_inner->bind_param('isssii', $row['id'], $row['navn'], $row['stilling'], $row['rolle'], userid, $postnr);
    $stmt_inner->execute();
}
$res->free();
$stmt->close();
$stmt_inner->close();

- men jeg er ikke 100% sikker. Du kan prøve - og så vil Erik sikkert uddybe årsagen til problematikken  =)

Du har ret: Hverken Erik eller jeg samler point. Du lægger bare selv et svar og accepterer det  =)
Avatar billede erikjacobsen Ekspert
27. august 2012 - 23:39 #13
Du har store tanker om mig, Ole. For store. Men ellers vil jeg kun have en chance for at gennemskue det, hvis jeg ser den helt originale kode, der skaber problemet, copy/paste, og ikke som i #3, hvor man ikke ved med sikkerhed hvad koden var. Det gider jeg ikke spilde min ungdom på :)
Avatar billede olebole Juniormester
27. august 2012 - 23:44 #14
Jeg ved bare, du har indgående kendskab til sprog som Java, Frascati og den slags, så deeeeeet ...  =)
Avatar billede erikjacobsen Ekspert
27. august 2012 - 23:47 #15
Hmm, programmeringssproget Frascati kender jeg ikke. Minder det om http://lolcode.com/ ?
Avatar billede olebole Juniormester
27. august 2012 - 23:56 #16
Hvis jeg skal være helt ærlig, så kan jeg ikke huske det. Jeg har forsøgt at kaste mig over syntaksen flere gange, men ender altid med at kaste mig op over den i stedet ... har jeg hørt. Jeg husker som sagt ikke meget selv  *-\
Avatar billede Klaphattens Novice
28. august 2012 - 12:13 #17
Ole -> du var spot on i #12.

tak til jer begge.
Avatar billede olebole Juniormester
28. august 2012 - 14:50 #18
Jamen, så tror jeg både Erik og jeg blev klogere. Tiltag med dét resultat er altid tiltrængte og velkomne  *D

Du ville så også kunne gøre sådan:

$stmt->bind_param('ii', $userid, $postnr);
$stmt->execute();
$stmt->bind_result($id, $navn, $stilling, $rolle);
while ($row = $stmt->fetch()) {
    $_id = $id;
    $_navn = $navn;
    $_stilling = $stilling;
    $_rolle = $rolle;
    $stmt_inner->bind_param('isssii', $_id, $_navn, $_stilling, $_rolle, $userid, $postnr);
    $stmt_inner->execute();
}

Ikke, at jeg synes, den kode er spor bedre - men den kan være med til at belyse/forklare problemet  =)
Avatar billede arne_v Ekspert
16. september 2012 - 03:23 #19
Umiddelbart synes jeg at det observerede virker meget logisk.

#2

$stmt = $mysqli->prepare('SELECT id, navn, stilling, rolle FROM liste WHERE userid = ? AND postnr = ?');
$stmt_inner = $mysqli->prepare('INSERT INTO valg (id, navn, stilling, rolle, bruger, postnr) VALUES(?,?,?,?,?,?)');

$stmt->bind_param('ii', $userid, $postnr);
$stmt->execute(); // skriv SQL til forbindelse og læs status fra forbindelse
$stmt->bind_result($id, $navn, $stilling, $rolle);
  while ($row = $stmt->fetch_array(MYSQLI_BOTH)) { // læs enkelt række fra forbindelse                           
  $stmt_inner->bind_param('isssii', $id, $navn, $stilling, $rolle, $userid, $postnr);
  $stmt_inner->execute(); // skriv SQL til forbindelse og læs status fra forbindelse
  }

$stmt_inner->close();
$stmt->close();


Forsøge at skrive/læse til/fra samme forbindelse for 2 SQL sætninger samtidigt => problem

#9

$stmt = $mysqli->prepare('SELECT id, navn, stilling, rolle FROM liste WHERE userid = ? AND postnr = ?');
$stmt_inner = $mysqli->prepare('INSERT INTO valg (id, navn, stilling, rolle, bruger, postnr) VALUES(?,?,?,?,?,?)');

$stmt->bind_param('ii', $userid, $postnr);
$stmt->execute();// skriv SQL til forbindelse og læs status fra forbindelse
$res = $stmt->get_result(); // læs alle rækker fra forbindelse
$a = array();
while ($row = $res->fetch_array(MYSQLI_ASSOC)) {                           
    $a[] = row;
}
$res->free();
$stmt->close();

foreach ($a as $row) {
    $stmt_inner->bind_param('isssii', $row['id'], $row['navn'], $row['stilling'], $row['rolle'], userid, $postnr);
    $stmt_inner->execute(); // skriv SQL til forbindelse og læs status fra forbindelse
}
$stmt_inner->close();


Intet overlap => intet problem.

#12

$stmt = $mysqli->prepare('SELECT id, navn, stilling, rolle FROM liste WHERE userid = ? AND postnr = ?');
$stmt_inner = $mysqli->prepare('INSERT INTO valg (id, navn, stilling, rolle, bruger, postnr) VALUES(?,?,?,?,?,?)');

$stmt->bind_param('ii', $userid, $postnr);
$stmt->execute(); // skriv SQL til forbindelse og læs status fra forbindelse
$res = $stmt->get_result(); // læs alle rækker fra forbindelse

while ($row = $res->fetch_array(MYSQLI_ASSOC)) {                           
    $stmt_inner->bind_param('isssii', $row['id'], $row['navn'], $row['stilling'], $row['rolle'], userid, $postnr);
    $stmt_inner->execute(); // skriv SQL til forbindelse og læs status fra forbindelse
}
$res->free();
$stmt->close();
$stmt_inner->close();


Intet overlap => intet problem.

Med denne forklaring vil der også være en tredie løsning på problemet, nemlig at have 2 forbindelser!
Avatar billede olebole Juniormester
16. september 2012 - 14:39 #20
@Arne: Jeg fandt også, at det 'umiddelbart virker meget logisk', men var ikke sikker nok til at være skråsikker  =)
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