Avatar billede sorenbs Nybegynder
22. oktober 2004 - 20:42 Der er 28 kommentarer og
1 løsning

gemme streng i variabel

Jeg har følgende kode:
<?php do { ?>
            <?php echo $row_AlleMailadresser['mail1']; ?>, <?php echo $row_AlleMailadresser['mail2']; ?>, <?php echo $row_AlleMailadresser['mail3']; ?>, <?php echo $row_AlleMailadresser['mail4']; ?>, <?php echo $row_AlleMailadresser['mail5']; ?>, <?php echo $row_AlleMailadresser['mail6']; ?>,
            <?php } while ($row_AlleMailadresser = mysql_fetch_assoc($AlleMailadresser)); ?>

Som genere en streng i stil med denne:
mail1, mail2, , ,mail5 , , , , , , , ,mail13 , , , , , , , , , , , , , , , , , ,

Hvordan gemmer jeg denne streng i en variabel?

Koden er genereret af dreamveawer og skal formentligt endres en smule :) men hvordan
Avatar billede stalle Nybegynder
22. oktober 2004 - 21:20 #1
Det var da godt nok den særreste php-kode jeg længe har set :D

Kan du ikke prøve at forklare hvad det er du vil opnå, for det der ser temmelig underligt ud..
Avatar billede coderdk Praktikant
22. oktober 2004 - 21:58 #2
Noget i stil med:

<?php

  while ( $row = mysql_fetch_assoc( $AlleMailadresser ) )
  {
    $var = "$row[mail1], $row[mail2], $row[mail3], $row[$mail4], $row[mail5], $row[mail6]";
    echo $var;
  }

?>
Avatar billede Slettet bruger
22. oktober 2004 - 23:22 #3
Nok nærmere:

<?php

$var='';
while ( $row = mysql_fetch_assoc( $AlleMailadresser ) ) {
  $var .= "$row[mail1], $row[mail2], $row[mail3], $row[$mail4], $row[mail5], $row[mail6]";
}

?>
Avatar billede Slettet bruger
22. oktober 2004 - 23:25 #4
Og så lige med et komma til sidst i hvert gennemløb, og fjernelse af det allersidste komma bagefter, så det er lige til at fylde i TO:-feltet i et mail-program.

<?php

$var='';
while ( $row = mysql_fetch_assoc( $AlleMailadresser ) ) {
  $var .= "$row[mail1], $row[mail2], $row[mail3], $row[$mail4], $row[mail5], $row[mail6],";
}
$var=substr($var,0,-1);

?>
Avatar billede olebole Juniormester
23. oktober 2004 - 01:37 #5
<ole>

Når jeg samler dynamiske strenge bruger jeg somregel et array og implode. Det gør at man slipper for at skulle regne på, hvormange tegn, der skal fjernes i sidste linie ... var det nu ',' eller ', ' ... 'OR', eller 'OR ' ... eller, hvad det nu kan være, der skal fjernes  :)

<?php

$a = array();
while ( $row = mysql_fetch_assoc( $AlleMailadresser ) ) {
  $a[] = "$row[mail1], $row[mail2], $row[mail3], $row[$mail4], $row[mail5], $row[mail6]";
}
$var=implode(", ", $a);

?>

Den er ikke rigtigere, bedre eller (væsentligt) hurtigere.
Den gør det bare enklere og sikrer, at man gør det rigtige i første hug - for mig i hvert fald  :)
Ikke mindst ved længere SQL-strenge med dynamisk opbyggede, betingede forespørgsler, synes jeg det er lettere at overskue på denne måde. Efterhånden er den nok blevet en vane.

I JavaScript er der faktisk en ikke uvæsentlig performance forbedring i at bruge en array-buffer fremfor en streng-buffer - men jeg er ikke sikker på, om det er også tilfældet i PHP(?)

/mvh
</bole>
Avatar billede sorenbs Nybegynder
23. oktober 2004 - 19:49 #6
Tak for svarene.
Jeg har prøvet med sandboxes og oleboles, og de virker begge to, eneste problem er at der ikke kommer noget med fra $row[mail1]
Hvad kan det skyldes?
Avatar billede sorenbs Nybegynder
23. oktober 2004 - 19:52 #7
Og ja Sandbox, du har regnet ud hvad det skal bruges til :)
Avatar billede coderdk Praktikant
23. oktober 2004 - 19:54 #8
At du ikke har en kolonne i databasen med det navn? Hedder den måske mail?
Avatar billede sorenbs Nybegynder
23. oktober 2004 - 20:34 #9
hmm, det var en mulighed :)
Men den kode jeg har lagt i spørgsmålet virker fint, og der hedder den jo mail1, men jeg vil da lige undersøge det.
Avatar billede sorenbs Nybegynder
23. oktober 2004 - 20:40 #10
Jeg fandt lige et problem mere.
hver 6. mail adresse kommer heller ikke med.
Avatar billede olebole Juniormester
23. oktober 2004 - 21:05 #11
Hvis de data står i din DB - og din SQL-sætning er i orden - bør de også blive hentet.
Avatar billede Slettet bruger
23. oktober 2004 - 23:38 #12
Hve sjette svarer netop til at der ikke kommer noget, hver gang, der står $row['mail1']

Helt sikker på at feltet hedder mail1?
Avatar billede sorenbs Nybegynder
24. oktober 2004 - 00:29 #13
Ja, for den gamle kode virkede jo, men jeg prøver lige at rode lidt med det
Avatar billede sorenbs Nybegynder
24. oktober 2004 - 00:49 #14
For at skabe lidt forståelse for den mærkelige kode jeg bruger kan jeg da lige vise hvordan min database er opbygget.
Den består af 13 kolonner og 5 rækker, og ser sådan ud

ID | navn1 | mail1 | navn2 | mail2 | navn3 | mail3  osv    | navn6 | mail6
1  |      |  11  |      |  12  |      |  13            |      |  16
2  |      |  21  |      |  22  |      |  23            |      |  26
3  |      |  31  |      |  32  |      |  33            |      |  36
4  |      |  41  |      |  42  |      |  43            |      |  46
5  |      |  51  |      |  52  |      |  53            |      |  56

jeg har fyldt alle mailfelterne med tal så man kan kende dem, så nu håber jeg der er nogen der kan se en sammenhæng :)
Og det jeg får ud er:
21, 22, 23, , 25, 26, 31, 32, 33, , 35, 36, 41, 42, 43, , 45, 46, 51, 52, 53, , 55, 56

Som i kan se mangler:
11, 12, 13, 14, 15, 16.
14, 24, 34, 44, 54.

Det er blevet lidt indviklet, men hvis der er nogen der har en god løsning, kan keg godt sætte nogle flere point af.
Avatar billede sorenbs Nybegynder
24. oktober 2004 - 00:52 #15
hmm, jeg prøver lige en gang til, men hvis det ikke virker skal tallene altså stå under mailfelterne

ID | navn1 | mail1 | navn2 | mail2 | navn3 | mail3  osv    | navn6 | mail6
1  |      |  11  |      |  12  |      |  13          |      |  16
2  |      |  21  |      |  22  |      |  23          |      |  26
3  |      |  31  |      |  32  |      |  33          |      |  36
4  |      |  41  |      |  42  |      |  43          |      |  46
5  |      |  51  |      |  52  |      |  53          |      |  56
Avatar billede sorenbs Nybegynder
24. oktober 2004 - 00:53 #16
Det vil da vist ikke helt som jeg vil, men jeg håber i kan se hvad jeg mener.
Avatar billede Slettet bruger
24. oktober 2004 - 01:06 #17
Så prøver vi med en modificeret udgave

<?php

$a = array();
while ( $row = mysql_fetch_assoc( $AlleMailadresser ) ) {
  $a[] = $row['mail1'];
  $a[] = $row['mail2'];
  $a[] = $row['mail3'];
  $a[] = $row['mail4'];
  $a[] = $row['mail5'];
  $a[] = $row['mail6'];
}
$var=implode(", ", $a);

?>
Avatar billede coderdk Praktikant
24. oktober 2004 - 01:22 #18
Må vi ikke lige se det stykke kode hvor du laver din query og hiver dem ud? I dit eksempel i starten ser det ud som om du allerede HAR hevet én ud, inden du går ind i dit do/while loop - den skal fjernes og alt skal hives ud i det nye while-loop... Det forklarer i hvert tilfælde hvorfor den første række mangler... Men ikke nummer 2?
Avatar billede sorenbs Nybegynder
24. oktober 2004 - 13:00 #19
sandbox > nu viser den også 14, 24, 34, 44, 54
men den viser stadig ikke alle dem der starter med 1.
Coderdk > Du har nok ret, jeg prøver lige at kigge lidt på det, som sagt er det meste lavet i dreamweaver, så jeg har ikke særligt meget styr på min kode.
Avatar billede sorenbs Nybegynder
24. oktober 2004 - 13:09 #20
Nu kører jeg først den nye kode:
<?php

$a = array();
while ( $row = mysql_fetch_assoc( $AlleMailadresser ) ) {
  $a[] = $row['mail1'];
  $a[] = $row['mail1'];
  $a[] = $row['mail2'];
  $a[] = $row['mail3'];
  $a[] = $row['mail4'];
  $a[] = $row['mail5'];
  $a[] = $row['mail6'];
}
$var=implode(", ", $a);

echo "$var";
?>

Og derefter den gamle kode:

<?php do { ?>
            <?php echo $row_AlleMailadresser['mail1']; ?>, <?php echo $row_AlleMailadresser['mail2']; ?>, <?php echo $row_AlleMailadresser['mail3']; ?>, <?php echo $row_AlleMailadresser['mail4']; ?>, <?php echo $row_AlleMailadresser['mail5']; ?>, <?php echo $row_AlleMailadresser['mail6']; ?>,
            <?php } while ($row_AlleMailadresser = mysql_fetch_assoc($AlleMailadresser)); ?>

Resultatet er at jeg på første linje, fra den nye kode, får alle fra 21 til 56
og på en ny linje, fra den gamle kode, får fra 11 til 16
Så den er ikke brugt før, eller hvad.
Avatar billede Slettet bruger
24. oktober 2004 - 13:15 #21
Måske kan vi lettere fange fejlen, hvis du viser os koden helt op til og med selve queryen.
Avatar billede Slettet bruger
24. oktober 2004 - 13:17 #22
Men ja, der bliver med sikkerhed kørt en $row_AlleMailadresser = mysql_fetch_assoc($AlleMailadresser) et sted før den løkke, og det er derfor den første række ikke er med.
Avatar billede sorenbs Nybegynder
24. oktober 2004 - 19:28 #23
Men hvorfor kommer den første række så med i den gamle kode?
Avatar billede Slettet bruger
24. oktober 2004 - 19:38 #24
Fordi den løkke kører sin datahentning EFTER løkken.

Det kunne vi egentlig også gøre, men så skal vi bruge samme variabel til rækkerne, som bliver hentet længere oppe.

<?php

$a = array();
do {
  $a[] = $row_AlleMailadresser['mail1'];
  $a[] = $row_AlleMailadresser['mail1'];
  $a[] = $row_AlleMailadresser['mail2'];
  $a[] = $row_AlleMailadresser['mail3'];
  $a[] = $row_AlleMailadresser['mail4'];
  $a[] = $row_AlleMailadresser['mail5'];
  $a[] = $row_AlleMailadresser['mail6'];
}while ( $row_AlleMailadresser = mysql_fetch_assoc( $AlleMailadresser ) ;
$var=implode(", ", $a);

echo "$var";
?>


Jeg vil gå ud fra, at grunden til, at den henter den første række tidligere, er, at den bruger det til at teste på, om der er nogen resultater. Det kunne dog sagtens have været gjort med mysql_num_rows() i stedet, så det kun var nødvendigt at hente selve data et sted.
Avatar billede sorenbs Nybegynder
24. oktober 2004 - 19:40 #25
Jeg prøvede lige at køre koden lige efter queryen, men det hjalp ikke, den viser stadig ikke 11, 12, 13, 14, 15, 16.
Avatar billede sorenbs Nybegynder
24. oktober 2004 - 19:45 #26
Det kunne den ikke lide, den melder om uventet ';'

<?php

$a = array();
do {
  $a[] = $row_AlleMailadresser['mail1'];
  $a[] = $row_AlleMailadresser['mail1'];
  $a[] = $row_AlleMailadresser['mail2'];
  $a[] = $row_AlleMailadresser['mail3'];
  $a[] = $row_AlleMailadresser['mail4'];
  $a[] = $row_AlleMailadresser['mail5'];
  $a[] = $row_AlleMailadresser['mail6'];
}while ( $row_AlleMailadresser = mysql_fetch_assoc( $AlleMailadresser ) ;
$var=implode(", ", $a);

echo "$var";
?>


i denne linje:
}while ( $row_AlleMailadresser = mysql_fetch_assoc( $AlleMailadresser ) ;
Avatar billede sorenbs Nybegynder
24. oktober 2004 - 19:51 #27
Jeg fant fejlen, der manglede ')' før ';'

Men nu virker det, tak skal i have alle sammen.

Sandbox > Det var dig der havde løsningen, så det må være dig der skal have pointene :)

Kan du nøjes med de 30, ellers må du jo sige til.
Avatar billede Slettet bruger
24. oktober 2004 - 19:56 #28
Jeg var kommet til at klippe for lidt, da jeg flyttede rundt på tingene til den sidste stump kode. Beklager.

Ork ja, 30 er fint.
Avatar billede sorenbs Nybegynder
24. oktober 2004 - 19:59 #29
Det kan jo ske :)

Tak igen
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