Oprettet man. d. 27. august 2012 kl. 10:50:16

Klaphattens
Klaphattens (1.970 point. Point ude: 75)

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 ;)

Skrevet man. d. 27. august 2012 kl. 11:44:31| #1

Du skal bare

  while ($stmt->fetch()) {
        print $id.$navn.$stilling.$rolle;
    }

Skrevet man. d. 27. august 2012 kl. 13:31:57| #2

Klaphattens
Klaphattens (1.970 point)
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?

Skrevet man. d. 27. august 2012 kl. 14:03:55| #3

Klaphattens
Klaphattens (1.970 point)
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.

Skrevet man. d. 27. august 2012 kl. 15:14:17| #4

olebole
olebole (216.878 point)
<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>

Skrevet man. d. 27. august 2012 kl. 15:16:45| #5

olebole
olebole (216.878 point)
PS: og ved brug af fetch_array, binder man ikke resultatet til variabler. Det gøres kun inden brug af fetch

Skrevet man. d. 27. august 2012 kl. 15:37:18| #6

Klaphattens
Klaphattens (1.970 point)
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.

Skrevet man. d. 27. august 2012 kl. 15:52:33| #7

olebole
olebole (216.878 point)
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

Skrevet man. d. 27. august 2012 kl. 16:10:06| #8

Klaphattens
Klaphattens (1.970 point)
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

Skrevet man. d. 27. august 2012 kl. 16:33:22| #9

olebole
olebole (216.878 point)
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();

Skrevet man. d. 27. august 2012 kl. 16:34:21| #10

olebole
olebole (216.878 point)
while ($row = $res->fetch_array(MYSQLI_ASSOC)) {                             
    $a[] = $row;
}

Skrevet man. d. 27. august 2012 kl. 17:05:37| #11

Klaphattens
Klaphattens (1.970 point)
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 :)

Skrevet man. d. 27. august 2012 kl. 21:02:57| #12

olebole
olebole (216.878 point)
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  =)

Skrevet man. d. 27. august 2012 kl. 23:39:05| #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å :)

Skrevet man. d. 27. august 2012 kl. 23:44:43| #14

olebole
olebole (216.878 point)
Jeg ved bare, du har indgående kendskab til sprog som Java, Frascati og den slags, så deeeeeet ...  =)

Skrevet man. d. 27. august 2012 kl. 23:47:20| #15

Hmm, programmeringssproget Frascati kender jeg ikke. Minder det om http://lolcode.com/ ?

Skrevet man. d. 27. august 2012 kl. 23:56:48| #16

olebole
olebole (216.878 point)
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  *-\

Skrevet tir. d. 28. august 2012 kl. 12:13:38| #17

Klaphattens
Klaphattens (1.970 point)
Ole -> du var spot on i #12.

tak til jer begge.

Skrevet tir. d. 28. august 2012 kl. 14:50:35| #18

olebole
olebole (216.878 point)
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  =)

Skrevet søn. d. 16. september 2012 kl. 03:23:40| #19

arne_v
arne_v (1.050.303 point)
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!

Skrevet søn. d. 16. september 2012 kl. 14:39:53| #20

olebole
olebole (216.878 point)
@Arne: Jeg fandt også, at det 'umiddelbart virker meget logisk', men var ikke sikker nok til at være skråsikker  =)

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   


Seneste spørgsmål

Hjælp ønskes til to løkker, der driller...

Oprettet den 18. juni 2013 kl. 15.28
allandk giver 30 point for svar | Giv et svar »

Faa xml out put som en variable

Oprettet den 18. juni 2013 kl. 14.08
techboy992 giver 30 point for svar | Giv et svar »

PHP Programmør søges!

Oprettet den 18. juni 2013 kl. 00.50
Japsen giver 0 point for svar | Giv et svar »







IT Kurser
Samarbejdspartnere

Udgiver · © 2013 Computerworld A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger