| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

13-12-2009, 21:31
|
 |
Hauser
Registrierter Benutzer
|
|
Registriert seit: Dec 2009
Ort: Ahnsbeck
Beiträge: 98
|
|
Update Bild in DB
Hallo Community,
ich habe mich nun doch entschieden das Skript (war Bestandteil einer anderen Frage) für meine Zwecke weiter zu entwickeln.
Ich habe nun Probleme mit dem Update von Bilddateien:
Hier das aendern.php mit dem Änderungsformular:
PHP-Code:
[LEFT]<form action = "../event/aendern.php" method = "post">
<?php $server = 'localhost'; $benutzer = 'root'; $passwort = ''; $datenbank = 'treffpunkt';
$verbindung = @mysqli_connect($server, $benutzer, $passwort);
if ($verbindung){ mysqli_select_db($verbindung, $datenbank);
if(mysqli_error($verbindung)){ echo 'Fehler: ' . mysqli_error($verbindung);
}else{ $sql = "SELECT * from event"; $abfrage = mysqli_query($verbindung, $sql);
//echo $sql;
echo "<table border='1', width='952 px'>"; echo "<tr> <td>Auswahl</td> <td>Ort</td>"; echo "<td>Name</td> <td>Datum</td>"; echo "<td>Beschreibung</td> <td>Bild</td></tr>";
while($event = mysqli_fetch_assoc($abfrage)){ $htmlCode = '<img src="img_get.php?id=' . $event['ID'] . '" width="50" height="50" alt="" />';
echo "<tr> <td><input type='radio' name='auswahl'"; echo " value={$event['ID']}></td> <td>" . $event['ort'] . "</td> <td>" . $event['name'] . "</td>"; echo "<td>" . $event['datum'] . "</td> <td>" . $event['beschreibung'] . "</td> <td>$htmlCode</td> </tr>";
} } }
echo "</table>";
mysqli_close($verbindung);
?> <p> <input type="submit" value="Datensatz anzeigen" /> </form> </div> <div class="erfassen"> <div class="starttext_event">Event ändern:</div> <div class="eingabe"> <div class="script">
<form action = "../event/best_aendern.php" method = "post" enctype="multipart/form-data"> <?php
$server = 'localhost'; $benutzer = 'root'; $passwort = ''; $datenbank = 'treffpunkt';
$verbindung = @mysqli_connect($server, $benutzer, $passwort);
if ($verbindung){ mysqli_select_db($verbindung, $datenbank);
if(mysqli_error($verbindung)){ echo 'Fehler: ' . mysqli_error($verbindung);
}else{
$auswahl= intval($_POST['auswahl']); $sql = "SELECT * FROM event WHERE ID = ".$auswahl;
//echo $sql;
$auswahl = mysqli_query($verbindung, $sql);
while($event = mysqli_fetch_assoc($auswahl)){
$id = $event["ID"]; $ort = $event["ort"]; $name = $event["name"]; $datum = $event["datum"]; $beschreibung = $event["beschreibung"]; $bname = $event["imgname"];
} } }
mysqli_close($verbindung);
?>
<br> <input type="text" name="id" size="24" value="<?php echo $id; ?>"> <br> <input type="text" name="ort" size="24" value="<?php echo $ort; ?>"> <br> <input type="text" name="name" size="24" value="<?php echo $name; ?>"> <br> <input type="text" name="datum" size="24" value="<?php echo $datum; ?>"> <br> <textarea cols="40" rows="5" name="beschreibung"><?php echo $beschreibung; ?></textarea> <br> <input type="text" name="imgname" size="24" value="<?php echo $bname; ?>"> <br> <input type="file" name="img" size="24" > <br> <input type="submit" value="ändern" > <input type="hidden" name="ID" value="<?php echo $id; ?>" />[/LEFT] </form>
Hier nochmal eine kleine Zwischenfrage zum alten Thema " Bild(name) aus DB".
Ist es richtig, dass man in einem "type="file" kein value anzeigen lassen kann? (habe dieses mal irgendwo gelesen.
Hier das bes_aendern.php
PHP-Code:
[LEFT]<?php /** * Debugging */ error_reporting(E_ALL); #zeig alle Fehler ini_set('display_errors', '1'); #sorgt dafür, dass überhaupt Fehler angezeigt werden
$server = 'localhost'; $benutzer = 'root'; $passwort = ''; $datenbank = 'treffpunkt';
$verbindung = mysqli_connect($server, $benutzer, $passwort);
if ($verbindung){ mysqli_select_db ($verbindung, $datenbank);
if(mysqli_error($verbindung)){ echo 'Fehler: Keine Verbindung zur Datenbank' . mysqli_error($verbindung);
}else{
if (isset($_POST['id'])) {
if (array_key_exists('img',$_FILES)) {
$tmpname = $_FILES['img']['tmp_name']; $type = $_FILES['img']['type']; $bname = $_FILES['img']['name']; $hndFile = fopen($tmpname, "r"); $data = addslashes(fread($hndFile, filesize($tmpname)));}
$sql = " UPDATE event SET ort='{$_POST['ort']}', name='{$_POST['name']}', datum='{$_POST['datum']}', beschreibung='{$_POST['beschreibung']}', imgdata='{$_POST['imgdata']}', imgtype='{$_POST['imgtype']}', imgname='{$_POST['imgname']}'
WHERE ID='{$_POST['id']}' "; mysqli_query($verbindung, $sql); echo 'Die Daten wurden erfolgreich geändert';
}else{ echo 'Die Daten wurden nicht geändert' . mysqli_error($verbindung, $sql) . '<br/>'; } }
$sql = 'SELECT * from event ORDER BY ID'; $abfrage = mysqli_query($verbindung, $sql);
echo '<h1>Sie haben ' . mysqli_num_rows($abfrage) . ' Einträge</h1>'; echo '<ul>'; while ($event = mysqli_fetch_assoc($abfrage)){ echo "<li>[{$event['ID']}] {$event['ort']} {$event['name']} {$event['datum']} {$event['beschreibung']}</li>"; } echo '</ul>'; mysqli_free_result($abfrage); } mysqli_close($verbindung);
echo '<br/><a href="../event/manager.php">Auswahl</a>.'; [/LEFT] ?>
Fehlermeldung:
Warning: fopen() [ function.fopen]: Filename cannot be empty in C:\xampp\htdocs\event\best_aendern.php on line 31
Warning: fread() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\event\best_aendern.php on line 32
Nur wenn ich das file Feld leer lasse und nur Text ändere.
Und wenn ich ein File update, dann:
Notice: Undefined index: imgdata in C:\xampp\htdocs\event\best_aendern.php on line 42
Notice: Undefined index: imgtype in C:\xampp\htdocs\event\best_aendern.php on line 43
Die Daten wurden erfolgreich geändert
Der Index imgdata und imgtype erstellen sich aus dem Script durch:
PHP-Code:
[LEFT]if (array_key_exists('img',$_FILES)) {
$tmpname = $_FILES['img']['tmp_name']; $type = $_FILES['img']['type']; $bname = $_FILES['img']['name']; $hndFile = fopen($tmpname, "r"); $data = addslashes(fread($hndFile, filesize($tmpname)));} [/LEFT]
Liegt hier der Fehler, dass das Script nicht zwei Operationen in einem Zug druchführen kann, bzw. ich den Verlauf des Scriptes anders abstimmen muss?
Daraus resultiert wahrscheinlich auch der fehlende Eintrag des Dateinamens in die DB, oder? Er zeigt mir desbezüglich keinen Fehler an, schreibt den Bildnamen aber auch nicht in die DB.
Wie bekomme ich das geregelt?
Gruß
|

13-12-2009, 22:14
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von Hauser
Ist es richtig, dass man in einem "type="file" kein value anzeigen lassen kann?
|
Ja - aus Sicherheitsgründen.
Wenn du ein Upload-Feld mit "C:\meineDaten\meinePasswoerter.txt" vorbelegst, dann auch noch irgendwie versteckst - dann sende ich als Nutzer womöglich Daten an deinen Server, von denen ich das nicht im geringsten beabsichtigt hatte.
Zitat:
Warning: fopen() [function.fopen]: Filename cannot be empty in C:\xampp\htdocs\event\best_aendern.php on line 31
[...]
Nur wenn ich das file Feld leer lasse und nur Text ändere.
|
Na dass du diesen Fall abfangen solltest, ist doch wohl klar?
Zitat:
Und wenn ich ein File update, dann:
Notice: Undefined index: imgdata in C:\xampp\htdocs\event\best_aendern.php on line 42
|
Natürlich, per file-Inputfeld geschickte Daten landen nicht in $_POST, sondern in $_FILES.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

13-12-2009, 23:10
|
 |
Hauser
Registrierter Benutzer
|
|
Registriert seit: Dec 2009
Ort: Ahnsbeck
Beiträge: 98
|
|
Klar, danke das leuchtet mir ein.
Die Frage die ich mir gerade stelle ist die, ob dieses File Script überhaupt in eine Update-Anweisung passt, oder ob ich es nicht einfach wie beim Erfassen den Daten mache, indem ich einfach eine neue Bilddatei einlese, als ob nie was drin gewesen ist.
Ich würde dann dem Update Script einfach ein INSERT Script folgen lassen.
Ich habe beim Udate einiges Ausprobiert, doch am "Undefined index:" komme ich irgendwie nicht vorbei. Die DB bekommt keine Bilddaten.
Gruß
|

13-12-2009, 23:29
|
 |
Hauser
Registrierter Benutzer
|
|
Registriert seit: Dec 2009
Ort: Ahnsbeck
Beiträge: 98
|
|
Zitat:
Zitat von Hauser
Die Frage die ich mir gerade stelle ist die, ob dieses File Script überhaupt in eine Update-Anweisung passt, oder ob ich es nicht einfach wie beim Erfassen den Daten mache, indem ich einfach eine neue Bilddatei einlese, als ob nie was drin gewesen ist.
Gruß
|
Was ein dummer gedanke !!! Bitte nicht !  . Danke.
Habe nun das versucht:
PHP-Code:
UPDATE event SET ort='{$_POST['ort']}', name='{$_POST['name']}', datum='{$_POST['datum']}', beschreibung='{$_POST['beschreibung']}', imgdata='{$_FILES['imgdata']}', imgtype='{$_FILES['imgtype']}', imgname='{$_POST['imgname']}' WHERE ID='{$_POST['id']}'
Er kann diese nicht zuordnen:
PHP-Code:
$_FILES['imgdata' $_FILES['imgtype'
|

13-12-2009, 23:32
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von Hauser
Er kann diese nicht zuordnen:
PHP-Code:
$_FILES['imgdata'
$_FILES['imgtype'
|
Na wo sollen diese Einträge denn auch herkommen?
Du hast kein file-Inputfeld mit dem Namen 'imgdata' oder 'imgtype'.
Schau dir den Inhalt von $_FILES erst mal mittels print_r oder var_dump an (vorher <pre> ausgeben, erhöht die Ubersichtlichkeit) - dann verstehst du vielleicht auch, welche Daten dir in welcher Struktur vorliegen.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

14-12-2009, 00:03
|
 |
Hauser
Registrierter Benutzer
|
|
Registriert seit: Dec 2009
Ort: Ahnsbeck
Beiträge: 98
|
|
OK, hab ein Ergebnis:
HTML-Code:
Array
(
[img] => Array
(
[name] => bier_wurst.bmp
[type] => image/bmp
[tmp_name] => C:\xampp\tmp\php80A2.tmp
[error] => 0
[size] => 344790
)
)
1
Das heißt ja schon mal, dass die Daten vorhanden sind.
Doch irgendwie happert es an der Zuordnung:
Hier mal mein Versuch:
PHP-Code:
UPDATE event SET ort='{$_POST['ort']}', name='{$_POST['name']}', datum='{$_POST['datum']}', beschreibung='{$_POST['beschreibung']}', imgdata='{$_FILES['img']}', imgtype='{$_FILES['type']}', imgname='{$_POST['name']}' WHERE ID='{$_POST['id']}'
|

14-12-2009, 00:10
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von Hauser
Doch irgendwie happert es an der Zuordnung:
|
Es hapert an deinem Verständnis von etwas so grundlegendem wie dem Umgang mit Arrays.
PHP-Code:
UPDATE
event
SET
...
imgdata='{$_FILES['img']}',
imgtype='{$_FILES['type']}',
imgname='{$_POST['name']}'
Es gibt in $_FILES keinen Eintrag unter dem Schlüssel 'type'.
Es gibt einen Eintrag unter dem Schlüssel 'img' - und dieser wiederum ist seinerseits ein Array, und das enthält Einträge unter Schlüsseln wie bspw. 'type' und 'name'.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

14-12-2009, 00:23
|
 |
Hauser
Registrierter Benutzer
|
|
Registriert seit: Dec 2009
Ort: Ahnsbeck
Beiträge: 98
|
|
Zitat:
Zitat von wahsaga
Es hapert an deinem Verständnis von etwas so grundlegendem wie dem Umgang mit Arrays.
|
Das es Arrays gibt war mir schon klar.
PHP-Code:
require_once '../inc/connect.inc.php'; $ort = $_POST['ort']; $name = $_POST['name']; $datum = $_POST['datum']; $beschreibung = $_POST['beschreibung']; if (array_key_exists('img',$_FILES)) { $tmpname = $_FILES['img']['tmp_name']; $type = $_FILES['img']['type']; $bname = $_FILES['img']['name']; $hndFile = fopen($tmpname, "r"); $data = addslashes(fread($hndFile, filesize($tmpname))); $strQuery = "INSERT INTO event (ort,name,datum,beschreibung,imgdata,imgtype,imgname) VALUES ('$ort','$name','$datum','$beschreibung','$data','$type','$bname')" ;
Schließlich generiert das Script ja aus einer Bilddatei die Informationen für die DB.
Da ich ja noch neu in diesem Thema bin, und mir mal jemand geschrieben hat, das es sich beim Update wie bei INSERT verhält, versuche ich ja nun den Weg bei Erfassen auf das Ändern anzuwenden.
Aber wat soll ich sagen, du hast recht, ich muss da etwas genauer einsteigen, so einfach wie ich dachte ist es dann doch nicht.
|

14-12-2009, 17:03
|
 |
Hauser
Registrierter Benutzer
|
|
Registriert seit: Dec 2009
Ort: Ahnsbeck
Beiträge: 98
|
|
So, habe mich mal etwas im Netz rumgetrieben und das Script ausfindig gemacht:
Parameters:
Table: Name of table to update
Data: array of $field->$value with new values
Id Field: Name of field to use as ID field
Id Value: Value of ID field
PHP-Code:
function mysql_update_array($table, $data, $id_field, $id_value) { foreach ($data as $field=>$value) { $fields[] = sprintf("`%s` = '%s'", $field, mysql_real_escape_string($value)); } $field_list = join(',', $fields); $query = sprintf("UPDATE `%s` SET %s WHERE `%s` = %s", $table, $field_list, $id_field, intval($id_value)); return $query; }
Leider finde ich im PHP Handbuch keine Funktion mysql_update_array. Ist das eine veralterte Anweisung oder passt die Funktion nicht zu meinem Projekt?
Wäre nett, wenn mir jemand mal mit der richtigen Anweisung auf die Sprünge helfen kann, den Rest versuche ich dann alleine Umzusetzen.
Danke.
|

14-12-2009, 17:05
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von Hauser
Leider finde ich im PHP Handbuch keine Funktion mysql_update_array.
|
Du hast sie doch gerade gefunden - schliesslich hast du den Code, aus dem sie besteht, zitiert.
Entweder war da eine Beschreibung, was die Funktion macht und was die Parameter bedeuten - oder du machst es dir selber klar.
Und anschliessend entscheidest du dann, ob du die Funktion für irgendwas brauchen kannst, oder nicht.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

26-12-2009, 17:14
|
 |
Hauser
Registrierter Benutzer
|
|
Registriert seit: Dec 2009
Ort: Ahnsbeck
Beiträge: 98
|
|
Ok, habe es jetzt gelöst, was lange wert....
PHP-Code:
[LEFT]require_once '../inc/login.inc.php';
$verbindung = mysqli_connect($server, $benutzer, $passwort);
if ($verbindung){
mysqli_select_db ($verbindung, $datenbank);
if(mysqli_error($verbindung)){ echo 'Fehler: Keine Verbindung zur Datenbank' . mysqli_error($verbindung);
}else{ echo print_r ($_POST);
if (isset($_POST['ID'])) {
if (array_key_exists('img',$_FILES)) {
$tmpname = $_FILES['img']['tmp_name']; $type = $_FILES['img']['type']; $bname = $_FILES['img']['name'];
if (strlen($tmpname)>0) {
$hndFile = fopen($tmpname, "r"); $data = addslashes(fread($hndFile, filesize($tmpname)));
}else { ($data = ""); }
$sql = " UPDATE event SET ort='{$_POST['ort']}', name='{$_POST['name']}', datum='{$_POST['datum']}', beschreibung='{$_POST['beschreibung']}'";
if (strlen($data)>0) {
$sql .= ",imgdata='$data', imgtype='{$_FILES['img']['type']}', imgname='{$_FILES['img']['name']}'"; } $sql .= " WHERE ID='{$_POST['ID']}'";
mysqli_query($verbindung, $sql); echo 'Die Daten wurden erfolgreich geändert';
}else{ echo 'Die Daten wurden nicht geändert' . mysqli_error($verbindung) . '<br/>'; } } }[/LEFT] } ?>
Vielen Dank nochmal für die Unterstützung.
Gruß
Hauser
|

26-12-2009, 23:39
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Dein Script ist anfällig für SQL-Injections, wodurch beliebige Datenbankzugriffe (lesen, schreiben, löschen) vom Benutzer erfolgen können.
|

02-01-2010, 14:20
|
 |
Hauser
Registrierter Benutzer
|
|
Registriert seit: Dec 2009
Ort: Ahnsbeck
Beiträge: 98
|
|
Zitat:
|
Dein Script ist anfällig für SQL-Injections, wodurch beliebige Datenbankzugriffe (lesen, schreiben, löschen) vom Benutzer erfolgen können.
|
Frohes neues erstmal !
Ja, da gebe ich dir natürlich recht und möchte mich auch gleich an die Arbeit machen.
Ich habe nun folgende Zeile abgeändert:
PHP-Code:
[LEFT]WHERE[/LEFT] ID='".mysql_real_escape_string($_POST['ID'])."'";
und erhalte folgende Meldung,
HTML-Code:
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ODBC'@'localhost' (using password: NO) in C:\xampp\htdocs\event\best_aendern.php on line 58
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in C:\xampp\htdocs\event\best_aendern.php on line 58
Die Daten wurden erfolgreich geändert
die ich nicht richtig verstehe. Findet er ( $_POST['ID']) nicht mehr ?
Könnte mir dazu jemand etwas Erklärung liefern.
Danke.
Gruß
Hauser
|

02-01-2010, 14:24
|
TobiaZ
 Moderator
|
|
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.188
|
|
Wenn er $_POST[id] nicht kennen würdest du eine fehlermeldung bekommen, die genau das besagt. Error_reporting ist doch entsprechend eingestellt?
Hast du schon eine Verbindung zu DB aufgebaut. Das sieht mir nämlich nicht so aus. Bzw. der Versuch schlägt fehl.
|

02-01-2010, 14:34
|
 |
Hauser
Registrierter Benutzer
|
|
Registriert seit: Dec 2009
Ort: Ahnsbeck
Beiträge: 98
|
|
Hallo und Danke für die Unterstützung.
Hier mal die Gesamtmeldung:
HTML-Code:
Array( [img] => Array ( [name] => [type] => [tmp_name] => [error] => 4 [size] => 0 ))1Array ( [ort] => al-Dente [name] => Frühstücksbufett [datum] => 12.12.2009 [beschreibung] => Frühstück für die ganze Familie [ID] => 15 ) 1
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ODBC'@'localhost' (using password: NO) in C:\xampp\htdocs\event\best_aendern.php on line 58
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in C:\xampp\htdocs\event\best_aendern.php on line 58
Die Daten wurden erfolgreich geändert
[B]Sie haben 2 Einträge[/B]
[14] Medleys Silvester XXL 31.12.2009 Wir feiern das Jahr 2010 !!! [15] al-Dente Frühstücksbufett 12.12.2009 Frühstück für die ganze Familie !!!
Also die Datenbank wird angesprochen und liefert auch Ergebnisse.
Ich verstehe schon bei der ersten Meldung nicht, warum er Passwort:NO ausgiebt, obgleich ich eines gesetzt habe.
Die Reportings sind alle Aktiv.
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|