Undefined variable en undefined index

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

MArk Peters

MArk Peters

08/08/2013 11:56:42
Quote Anchor link
Onderstaand scriptje gebruik ik om data vanuit een csv-file over te zetten in MySQL.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php  
require_once "../conf.php";

//connection to the database
$mysqli = new mysqli($hostname, $username, $password, 'pdmklas');
if(mysqli_connect_errno())
    trigger_error('Fout bij verbinding: '.$mysqli->error);

if ($_FILES['csv']['size'] > 0) {

    //get the csv file
    $file = $_FILES['csv']['tmp_name'];
    $handle = fopen($file,"r");

    /* change character set to utf8 */
    if (!$mysqli->set_charset("utf8")) {
        printf("Error loading character set utf8: %s\n", $mysqli->error);
    }

    
    //loop through the csv file and insert into database
    do {
        if ($data[0]) {
            $naam=addslashes($data[2]) . ' ' . addslashes($data[3]) . ' ' . addslashes($data[4]);
            $resultaat = $mysqli->query("INSERT INTO KLASSEN (klas, stamnummer, leerling) VALUES
                (
                    '"
.addslashes($data[0])."',
                    '"
.addslashes($data[1])."',
                    '"
.$naam."'
                )
            "
);
            
        if ($resultaat == false)
            echo "Query mislukt. Importeren: " . $mysqli->error;

        }
    }
while ($data = fgetcsv($handle,1000,",","'"));
    //

    $mysqli->close();
        
    //redirect
    header('Location: ?success=1'); die;

}



<!
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<
title>Importeer klassenlijst</title>
<
/head>

<
body>

[
code]<?php if (!empty($_GET['success'])) { echo "<b>Bestand is geimporteerd.</b><br><br>"; } //generic success notice ?>


<form action="" method="post" enctype="multipart/form-data" name="form1" id="form1">
  <h2>Selecteer bestand met leerling-namen:</h2> <br />
  <input name="csv" type="file" id="csv" /> <br/><br/><br/>
  <div align="center"><input type="submit" name="Submit" value="IMPORTEREN.." /> </div>
</form>

</body>
</html>
?>

Dit werkt op zich prima maar krijg onderstaande meldingen in mijn log-file en die wil ik er graag nog uit hebben :D
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?
[Thu Aug 08 11:51:27 2013] [error] [client 192.168.1.2] PHP Notice:  Undefined variable: data in /media/DATA-SCHIJF/TestW
eb/aoc_observatie/IMPORT/import_leerling.php on line 22, referer: http://pwserver/testweb/aoc_observatie/IMPORT/import_le
erling.php?success=1
[Thu Aug 08 11:51:27 2013] [error] [client 192.168.1.2] PHP Notice:  Undefined index: csv in /media/DATA-SCHIJF/TestWeb/a
oc_observatie/IMPORT/import_leerling.php on line 9, referer: http://pwserver/testweb/aoc_observatie/IMPORT/import_leerlin
g.php?success=1
?>

Heb bovenstaande ff in een php-identifier gehangen zodat het beter leesbaar is maar is natuurlijk in het echt geen php
Gewijzigd op 08/08/2013 11:59:49 door MArk Peters
 
PHP hulp

PHP hulp

22/12/2024 20:32:25
 
Kris Peeters

Kris Peeters

08/08/2013 13:22:55
Quote Anchor link
Het gaat hier om.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
    do {
        if ($data[0]) {
...
    }
while ($data = fgetcsv($handle,1000,",","'"));
?>


De eerste iteratie zit je met een probleem.
Je wil weten of $data[0] een waarde heeft (die niet als false wordt geëvalueerd). Maar $data wordt pas aangemaakt op het einde an de eerste iteratie.

Een aantal dingen die je kan doen:
- een while in plaats van een do/while
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
    while ($data = fgetcsv($handle,1000,",","'")) {
        if ($data[0]) {
...
    }

?>


------

Maar dan nog iets; dit geldt trouwens voor beide notice's:
Vooraleer je een variabele wil gebruiken, moet ze eerst bestaan.
Een voorbeeld
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
// niet doen!!
if($a > 5) {  // hier bestaat $a nog niet.  Het is dan ook compleet zinloos om te vragen of een niet-bestaande variabele groter is dan 5
  ...
}

$a = 7;
?>


Weten of iets bestaat, doe je met isset().
bv zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
if (isset($_FILES['csv']['size']) && $_FILES['csv']['size'] > 0) {
?>

Dan vraag je dus: "Als het bestaat; kijk dan of het groter is dan nul".

Snap je wat het probleem is, en wat je vanaf nu voor de rest van je leven zal doen wanneer je een notice ziet?
Gewijzigd op 08/08/2013 13:24:01 door Kris Peeters
 
MArk Peters

MArk Peters

08/08/2013 13:39:25
Quote Anchor link
Werkt nu perfect enne ik heb mijn lesje geleerd :D
 
Kris Peeters

Kris Peeters

08/08/2013 14:04:25
Quote Anchor link
Fijn.

Tja, als we gewoon zeggen: doe isset($variabele), komen ze vaak de volgende dag terug met exact het zelfde probleem, de volgende notice die ze krijgen.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.