Avatar billede mrmox2 Nybegynder
24. november 2014 - 13:01 Der er 14 kommentarer og
1 løsning

SQL (mysqli objektorienteret) til array og videre til CSV

Jeg forsøger at få lagt en hel forespørgsel til sql ind i et array.

Indtil nu er det lykkedes at få en enkelt linje ud. Gætter på at problemet ligger i at den opfatter mit array som 1-dimensionalt men jeg må indrømme at jeg løbet tør for ideer.

Denne kode ---------------------------------

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-15">
<title>Statistik klar</title>
<link href="css/indhold.css" rel="stylesheet" type="text/css">
</head>
<body>
array1

<?php

$mysqli = new mysqli("localhost", "user", "pass", "database");

if ($conn->connect_error) {
  trigger_error("Database connection failed: "  . $conn->connect_error, E_USER_ERROR);
}

$query = "SELECT Place, Date FROM poll";
$result = $mysqli->query($query);

$showme = mysqli_fetch_array($result, MYSQL_NUM);

print_r ($showme);

for ($row = 0; $row < 2; $row++) {
  echo "<p><b>Row number $row</b></p>";
  echo "<ul>";
  for ($col = 0; $col < 2; $col++) {
    echo "<li>".$showme[$row][$col]."</li>";
  }
  echo "</ul>";
}

$mysqli->close();

$file = fopen("contacts.csv","w");

foreach ($showme as $line)
  {
  fputcsv($file,explode(',',$line));
  }

fclose($file);

?>
</body>
</html>

---------------------------------------------------

Giver dette output på skærmen ---------------------
array1 Array ( [0] => Thomas R [1] => 2014-11-19 )

Row number 0

    T
    h

Row number 1

    2
    0

---------------------------------------------------

Og dette output i csv filen -----------------------

"Thomas R"
2014-11-19

---------------------------------------------------
Avatar billede mrmox2 Nybegynder
24. november 2014 - 13:02 #1
Skal måske lige tilføje at forespørgslen returnerer over 100 linjer når jeg laver den direkte i SQL
Avatar billede Slater Ekspert
24. november 2014 - 13:34 #2
Den opfatter ikke bare dit array som étdimensionelt, det ér etdimensionelt. Derfor når du behandler det som todimensionelt får du enkelte bogstaver ud af strengen i stedet - det er helt som det skal være.

Dit problem er at du kun fetcher en række. Funktionen mysql_fetch_array skal ikke kun køres en gang, den skal køres for hver række - og outputter én række.

Altså: while ($row = mysql_fetch_array()) {}
Avatar billede mrmox2 Nybegynder
24. november 2014 - 13:45 #3
hej - tak for svar

Vil det sige at jeg bare skal sætte min sætning ind i den løkke? Eller er det ikke helt så simpelt?

while ($row = mysql_fetch_array()) {
$showme = mysqli_fetch_array($result, MYSQL_NUM);
}
Avatar billede mrmox2 Nybegynder
24. november 2014 - 13:51 #4
btw - forbindelsen er en mysqli objektorienteret - ikke myqsl_connect
Avatar billede mrmox2 Nybegynder
24. november 2014 - 13:53 #5
det skulle stå mysql_connect i stedet for myqsl_connect :)
Avatar billede Slater Ekspert
24. november 2014 - 19:19 #6
Sådan som i #3 vil du få den to gange for hver loop. Du skal bare køre

while ($row = mysql_fetch_array(/*bla bla*/))
{
  // Dette bliver kørt for hver række, og du har adgang til dataene i rækken med $row variablen. Du skal ikke fetche igen.
}
Avatar billede mrmox2 Nybegynder
24. november 2014 - 21:23 #7
jeps - nu sker der noget

while ($row = mysqli_fetch_array($result, MYSQL_NUM)){
$showme = $row;
}

giver mig hele den seneste record

skal jeg lave en "for" eller "while" løkke for at gøre $showme 2 dimensional? Den skal jo nok tælle op på en eller anden måde?

Sorry hvis det er lidt banalt, men jeg kan mærke at jeg er lidt lost på det her :)
Avatar billede mrmox2 Nybegynder
24. november 2014 - 22:48 #8
fandt den her kode et sted:

$i=-1;

while($row = mysqli_fetch_array($result))
{
    $i++;

    $data[$i]['Date']=$row['Date'];
    $data[$i]['Place']=$row['Place'];

}

print_r ($data);


Den giver følgende output: af print_r

Array ( [0] => Array ( [Date] => 2014-11-19 [Place] => Thomas R ) [1] => Array ( [Date] => 2014-11-19 [Place] => Thomas R ))

Er det ikke korrekt format?

Ville dog hellere have at det var numerisk, men hvis jeg skriver
while($row = mysqli_fetch_array($result, MYSQL_NUM))
får jeg som output
Array ( [0] => Array ( [Date] => [Place] => ) [1] => Array ( [Date] => [Place] => ))

Min print løkke bruger jo numre til at skrive ud - eller det er i hvert fald det som jeg tror jeg har lavet :)
Avatar billede mrmox2 Nybegynder
24. november 2014 - 22:58 #9
ok, havde ikke lige gennemskuet at det jo var mig selv der navngav kolonner

med nedenstående kode virker alt pånær csv

visning af array på skærmen er for print_r:

Array ( [0] => Array ( [0] => 2014-11-19 [1] => Thomas R ) [1] => Array ( [0] => 2014-11-19 [1] => Thomas R ))

Og for listen

Row number 0

    2014-11-19
    Thomas R

Row number 1

    2014-11-19
    Thomas R


Koden ----------------------


$query = "SELECT Date, Place FROM poll";
$result = $mysqli->query($query);

$i=-1;

while($row = mysqli_fetch_array($result))
{
    $i++;

    $data[$i]['0']=$row['Date'];
    $data[$i]['1']=$row['Place'];
}

print_r ($data);

for ($col = 0; $col < 2; $col++) {
  echo "<p><b>Row number $col</b></p>";
  echo "<ul>";
  for ($row = 0; $row < 2; $row++) {
    echo "<li>".$data[$col][$row]."</li>";
  }
  echo "</ul>";
}

$mysqli->close();

$file = fopen("stat.csv","w");

foreach ($data as $line)
  {
  fputcsv($file,explode(',',$line));
  }
fclose($file);
Avatar billede mrmox2 Nybegynder
24. november 2014 - 23:18 #10
hallo - sniffede rundt omkring og fandt den her kode på
http://stackoverflow.com/questions/13108157/php-array-to-csv
det render lige igennem det hele og giver mig en csv fil til download

$num = 0;
$sql = "SELECT Date, Place FROM poll";
if($result = $mysqli->query($sql)) {
    while($p = $result->fetch_array()) {
        $prod[$num]['Date']          = $p['Date'];
        $prod[$num]['Place']        = $p['Place'];
       
        $num++;       
    }
}
$output = fopen("php://output",'w') or die("Can't open php://output");
header("Content-Type:application/csv");
header("Content-Disposition:attachment;filename=stat.csv");
fputcsv($output, array('Date','Place'));
foreach($prod as $product) {
    fputcsv($output, $product);
}
fclose($output) or die("Can't close php://output");
Avatar billede mrmox2 Nybegynder
24. november 2014 - 23:39 #11
Til gengæld får man siden header og det hele med i den csv fil ... kunne jeg godt undvære
Avatar billede mrmox2 Nybegynder
25. november 2014 - 00:12 #12
Altså csv filen indeholder disse linjer i starten
hvor i koden styrer jeg det?

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html
<title>Statistik klar</title>
<link href="css/indhold.css" rel="stylesheet" type="text/css">
</head>
<body>
Avatar billede mrmox2 Nybegynder
25. november 2014 - 00:40 #13
@viperine: smider du ikke lige et svar - så får du ½-dele af pts for at henlede opmærksomheden på 1D array og på while

så bruger jeg resten af pts til at lave et eget spørgsmål om den del at problemet der går på csv xporten

mvh thomas
Avatar billede mrmox2 Nybegynder
25. november 2014 - 09:52 #14
har fixet csv export
lagde bare php over i sin egen fil uden nogen form for anden kode end php

aner ikke hvorfor det kom med men hovedsagen er at det virker :)
Avatar billede mrmox2 Nybegynder
04. december 2014 - 01:37 #15
OK, lukker
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

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