Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo Leute,

Wer kann mir helfen?

Ich habe eigentlich von kurzen angefangen PHP und MySQL zu lernen.

Ich kann schon einiges, aber bei einer Sache bin ich stehen geblieben und komme gar nicht mehr weiter. Und jetzt zu Sache:

Ich möchte in einer MySQL-Datenbank durch PHP-Code einen beliebigen Text und link fürs Bild zu speichern, aber es funktioniert nicht. (Wie immer)

<?php
$uploaddir = "D:/program files/xampp/htdocs/images/";
?>

<form action="index_r.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000">
<table>
<tr>
<td>bild</td>
<td><input type="file" name="bild"></td>
</tr>
<tr>
<td>Inhalt der Nachricht</td>
<td><textarea name="content" cols="50" rows="20"></textarea></td>
</tr>
<tr>
<td><input type="submit" value="speichern"></td>
</tr>
</table>
</form>
<?php

$insert_sql="INSERT INTO angebot SET";
$insert_sql.="', content='".htmlentities($_REQUEST['content'], ENT_NOQUOTES);
if(!empty($_FILES['bild']['name'])){
$insert_sql.="', bild='/images/".$_FILES['bild']['name'];
}
if(!empty($_FILES['bild']['name'])){
$test = move_uploaded_file($_FILES['bild']['tmp_name'], $uploaddir . $_FILES['bild']['name']);
}
?>[/PHP]

In meiner Datenbank ist „id“ als „auto_increment“ definiert.

Wo hab ich den Fehler gemacht?

MfG Max

Geschrieben
kann mier auch vorstellen, aber welche Fehler?

ich sehe eigentlich keinen

MfG max

Ich aber:


// das hier
$insert_sql="INSERT INTO angebot SET";
$insert_sql.="', content='".htmlentities($_REQUEST['content'],

// ergibt: INSERT INTO angebot SET', content=' usw.
[/PHP]

Lass dir doch mal das generierte SQL-Statement ausgeben.

Geschrieben
Ich möchte in einer MySQL-Datenbank durch PHP-Code einen beliebigen Text und link fürs Bild zu speichern, aber es funktioniert nicht.

Ganz einfach, du hast du Insert-Syntax mit der Update-Syntax verwechselt...

Die Syntax für Insert ist:

INSERT INTO TabellenName (FeldName1, FeldName2, FeldName3) VALUES (InhaltFuerFeld1, InhaltFuerFeld2, InhaltFuerFeld3);

Geschrieben
Ganz einfach, du hast du Insert-Syntax mit der Update-Syntax verwechselt...

Nur weil man etwas nicht nutzt oder kennt, heißt noch lange nicht, dass es prinzipiell nicht funktioniert. ;)

7.4.2. INSERT-Syntax


    INSERT [LOW_PRIORITY | DELAYED] [IGNORE]

        [INTO] tabelle [(spalten_name,...)]

        VALUES (ausdruck,...),(...),...

oder  INSERT [LOW_PRIORITY | DELAYED] [IGNORE]

        [INTO] tabelle [(spalten_name,...)]

        SELECT ...

oder  INSERT [LOW_PRIORITY | DELAYED] [IGNORE]

        [INTO] tabelle

        SET spalten_name=ausdruck, spalten_name=ausdruck, ...


Gruß Jaraz

Geschrieben

Ich weiß nun nicht, ob das so Absicht ist aber irgendwie vermisse ich da ein mysql_connect() und nach dem SQL- String etwas wie mysql_db_query oder ein select_db() mit einem mysql_query().

Also es wird keine Verbindung erstellt und der SQL- String wird gar nicht erst ausgeführt.

Falls das nun doch irgendwo in Deinem Script steht, dann kannst du übrigens auch mit der Funtkion mysql_error() Dir den SQL- Fehler anzeigen lassen. In diesem Fall sollte der Dir sagen, dass da ein Hochkommata fehlt.

Geschrieben
Zitat von JARAZ

INSERT [LOW_PRIORITY | DELAYED] [iGNORE]

[iNTO] tabelle

SET spalten_name=ausdruck, spalten_name=ausdruck, ...

Jaraz, ich habe doch gleiche, aber...:(

$insert_sql= "INSERT INTO angebot SET";
if(!empty($_FILES['bild']['name'])){
$insert_sql.="' bild='/intranet/images/".$_FILES['bild']['name'];
}
if(!empty($_FILES['bild']['name'])){
$test = move_uploaded_file($_FILES['bild']['tmp_name'], $uploaddir . $_FILES['bild']['name']);
}
$insert_sql.="', content='".htmlentities($_REQUEST['content'], ENT_NOQUOTES);[/PHP]

Geschrieben

Die Syntax ist aber

INSERT INTO Tabelle (Spalten) VALUES (Werte);

Also auf Dein Beispiel:



$insert_sql = "INSERT INTO angebot (bild,
content)
VALUES ('/intranet/images/".$_FILES['bild']['name']."',
'".htmlentities($_REQUEST['content']."');";

[/PHP]

Nebenbei empfiehlt sich statt $_REQUEST[] entweder $_POST[] oder $_GET[].

Abgesehen davon fehlten bei Dir immernoch Hochkommata bei den Werten. Du willst Strings in die Felder schreiben. Strings werden aber immer von " oder ' eingeschlossen. Wenn Du zwar am Anfang des Strings mit dem Wert zwar ein ' machst aber nicht am Ende, bekommst Du natürlich eine Fehlermeldung angezeigt, wenn Du mysql_error() benutzt hättest.

Geschrieben
Die Syntax ist aber

INSERT INTO Tabelle (Spalten) VALUES (Werte);

Lies doch nochmal das Posting von Jaraz.

@madmax:

Der Fehler liegt wohl eher an dem nicht richtigen $insert_sql.

$insert_sql= "INSERT INTO angebot SET";
if(!empty($_FILES['bild']['name'])){
$insert_sql.="' bild='/intranet/images/".$_FILES['bild']['name'];
[/PHP]

Besser wäre...

[php]
$insert_sql.="' bild='/intranet/images/".$_FILES['bild']['name']."'";

Geschrieben

Gelesen habe ich es und ich finde es unheimlich toll, dass MySQL das so unterstützt. Wer braucht schon eine SQL- Syntax, die zu anderen DBMS portabel ist, geschweigedenn ANSI SQL.

http://www.issociate.de/board/post/161583/Problem_beim_L%C3%B6schen_und_Wiedereinf%C3%BCgen.html

Das wichtige Zitat da:

Johannes Vogel wrote:

>>> insert into phamily_freunde set pyfr_SHB_ID_benutzer =3D 671,

>>> pyfr_SHB_ID_freund =3D 2

>>

>> Das ist aber kein gültiger Insert Syntax. Das ist eine Mischung aus =

>> Update und Insert.

>

>

> Humbug. Das vorliegende Insert-Statement ist korrekt.

Die UPDATE-artige INSERT-Syntax mit SET ist, so schön sie auch sein mag=

,

eine MySQL-spezifische Erweiterung und nicht ANSI SQL.

Die Syntax hat gegenüber

INSERT INTO tabelle (fieldlist) VALUES (valuelist)

den Vorteil das auch bei Zuweisungen an viele Spalten die Zuordnung

Werten zu Spalten immer sofort klar ist während man bei der ANSI

Syntax nur durch Abzählen in fieldlist und valuelist herausbekommt

welcher Wert zu welcher Spalte gehört. Noch schlimmer wird es wenn

das INSERT Statement ganz ohne fieldlist daher kommt ...

Nachteil der MySQL-Syntax ist aber eben das sie MySQL-spezifisch ist

und von anderen SQL Dialekten nicht unterstützt wird.

Wenn man schon von Grund auf neu lernt, kann man sich ruhig mal daran halten um dafür dann später auch mit anderen DBMS zurecht zu kommen. Aber ist natürlich jedem selbst überlassen, ob er sich nun lieber an Programmierstandards hällt oder lieber sein eigenes Süppchen kocht. Wird nur dumm, wenn MySQL vieleicht auch mal noch weiter auf SQL-92 angepasst wird.

Geschrieben

<?php

$insert_sql = "INSERT INTO angebot SET";
$insert_sql .= " content='".htmlentities($_REQUEST['content'], ENT_NOQUOTES)."'";
if(!empty($_FILES['bild']['name'])){
$insert_sql.=", bild='/images/".$_FILES['bild']['name']."'";
}

if(!empty($_FILES['bild']['name'])){
$test = move_uploaded_file($_FILES['bild']['tmp_name'], $uploaddir . $_FILES['bild']['name']);
}

?>[/php]

wobei ich da noch mysql_real_escape_string() bzw. mysql_escape_string() empfehlen würde.

Und wie schon zuvor gesagt würde, nutz lieber $_POST dafür ($_GET geht nicht, weils ja nen Upload ist!)

Ihr müsst zwischendurch auch auf die Leerzeichen etc. schauen.

Aber ich finde es interessant, wie lange ihr doch braucht um jemandem zu helfen. Statt dem immer zu sagen, was er denn anders machen könnte, oder sonstwas solltet ihr ihm besser mal helfen.

Geschrieben

Dank alle und nach einigen Änderungen wird das Bild in Imagedatei , aber in der Datenbank wird nichts gespeichert. Dann komme ich noch mal zu Sache: Ich habe ein Datenbank mit drei Spalten(id(int, auto_increment), bild(text), content(text)). Jetzt sieht bei mir so aus:

<?php
$uploaddir = "D:/program files/xampp/htdocs/images/";
?>
<form action="index_r.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000">
<table>
<tr>
<td>bild</td>
<td><input type="file" name="bild"></td>
</tr>
<tr>
<td>Inhalt der Nachricht</td>
<td><textarea name="content" cols="50" rows="20"></textarea></td>
</tr>
<tr>
<td><input type="submit" value="speichern"></td>
</tr>
</table>
</form>
<?php

$insert_sql= "INSERT INTO angebot SET";

if(!empty($_FILES['bild']['name'])){
$insert_sql.=" bild='/images/".$_FILES['bild']['name']."'";
}
if(!empty($_FILES['bild']['name'])){
$test = move_uploaded_file($_FILES['bild']['tmp_name'], $uploaddir . $_FILES['bild']['name']);
}
$insert_sql.=", content='".htmlentities($_REQUEST['content'], ENT_NOQUOTES)."'";
?>[/PHP]

Ich kann immer noch nicht verstehen, was ich falsch mache.

MfG max:hells:

Geschrieben

Also Punkt Nummer eins wäre wohl, dass da wohl nur was passieren soll, wenn das Formular abgeschickt wurde. Bei Dir wird direkt schon beim ersten Aufrufen der Seite nen SQL- Statement fertig gemacht.

Zudem kommt, dass Du immer noch keine Verbindung zur Datenbank herstellst.

Also den Ganzen php- Teil am Ende so abändern:



<?php
$uploaddir = "D:/program files/xampp/htdocs/images/";
?>
<form action="index_r.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000">
<table>
<tr>
<td>
bild
</td>
<td>
<input type="file" name="bild">
</td>
</tr>
<tr>
<td>
Inhalt der Nachricht
</td>
<td>
<textarea name="content" cols="50" rows="20"></textarea>
</td>
</tr>
<tr>
<td>
<input type="submit" value="speichern" name="btnSpeichern">
</td>
</tr>
</table>
</form>
<?php
// Wenn der Button speichern gedrueckt wurde
if (isset($_POST['btnSpeichern']))
{
$strHost = "Server"; // Sollte locahlhost sein
$strUsername = "Benutzername";
$strPW = "Passwort";
$strDBName = "Datenbankname";

$strServer = mysql_connect ($strHost, $strUsername, $strPW) or die("Verbindung zur Datenbank fehlgeschlagen"); // Verbindung zur Datenbank herstellen

$insert_sql= "INSERT INTO angebot SET";

if(!empty($_FILES['bild']['name']))
{
$insert_sql.=" bild='/images/".$_FILES['bild']['name']."'";
}
if(!empty($_FILES['bild']['name']))
{
$test = move_uploaded_file($_FILES['bild']['tmp_name'], $uploaddir . $_FILES['bild']['name']);
}
$insert_sql.=", content='".htmlentities($_REQUEST['content'], ENT_NOQUOTES)."';";

$Ergebnis = mysql_db_query($strDBName, $insert_sql, $strServer) or die (mysql_error()); // SQL- Statement ausführen und bei einem Fehler die MySQL- Fehlermeldung ausgeben
}
?>

[/PHP]

Das sollte nun wirklich als Tipp reichen.

Geschrieben

Ui nun werden wir auch noch altmodisch.

mysql_db_query

This function is deprecated, do not use this function. Use mysql_select_db() and mysql_query() instead.

Du verbindest zum Server aber selektierst keine Datenbank generell. Du selektierst sie erst beim Eintragen in die Datenbank. Das ist nicht so unbedingt toll. Dafür musst du noch mysql_select_db() nehmen.

Du solltest dich mit den Datentypen ein wenig auseinandersetzen. Wenn dieses "str" vor deinen Variablen "string" heissen soll, dann kann ich dir sagen, dass "$strServer" ein link resource beinhaltet und keinen String.

<?php
// Wenn der Button speichern gedrueckt wurde
if (isset($_POST['btnSpeichern']))
{
$strHost = "Server"; // Sollte locahlhost sein
$strUsername = "Benutzername";
$strPW = "Passwort";
$strDBName = "Datenbankname";

// Verbindung zur Datenbank herstellen
$strServer = mysql_connect($strHost, $strUsername, $strPW) or die("Verbindung zur Datenbank fehlgeschlagen");

$insert_sql= "INSERT INTO angebot SET";

if(!empty($_FILES['bild']['name']))
{
$insert_sql.=" bild='/images/".mysql_escape_string($_FILES['bild']['name'])."'";
}
if(!empty($_FILES['bild']['name']))
{
$test = move_uploaded_file($_FILES['bild']['tmp_name'], $uploaddir . $_FILES['bild']['name']);
}
$insert_sql.=", content='".mysql_escape_string($_REQUEST['content'])."'";

// SQL- Statement ausführen und bei einem Fehler die MySQL- Fehlermeldung ausgeben
$Ergebnis = mysql_query($insert_sql, $strServer) or die (mysql_error());
}

?>[/php]

Geschrieben

Stimmt, ich könnte da auch ein hdl für Handle nehmen aber wozu? Das dient nur für mich zur Orrientierung.

Ich könnte natürlich auch ein mysql_select_db() abschicken und dann nur mysql_query() aber auch dass ist nicht notwenig, wenn ich mysql_db_query nutzen möchte.

Im übrigen solltest Du dich selbst, wie Du hier schon geschrieben hast, auf Deinen Lösungsvorschlag konzentrieren, anstatt nun auf mich loszugehen. Denn in Deinem Vorschlag wurde immer noch das SQL- Statement gefüllt, bevor das Formular abgeschickt wurde und Du auch nicht bemerkt hast, dass keine Datenbankverbindung besteht. Bitte bleibe bei Deinen Leisten bevor Du nun auf mir rumhacken willst.

Im Übrigen funktioniert Dein letztes Beispiel nicht, da keine Datenbankverbindung ausgewählt wurde. Aber das ist nun ja kein Argument gegen mysql_query().

Geschrieben

Es dient der Orientierung? Ihr müsst auch mal dran denken, dass auch mal andere euren Code sehen und nicht immer die Lust haben sich durch euren kompletten Code zu wursten. Deshalb solltet ihr nicht für euer Verständnis programmieren, da ihr euren Code versteht, aber nicht jeder andere. Ich kann nun natürlich auch mit $samkpcaseju4w09t34 Variablen arbeiten. Auch kein Problem. Wenn man nun deine Definierung von $strServer gesehen hätt, hätte hier bestimmt keiner gewusst was da drin steht.

..., dass keine Datenbankverbindung besteht.

Es besteht eine Datenbankverbindung. Es wurde eine Verbindung zum Db-Server aufgebaut, aber es wurde keine Datenbank ausgewählt.

Okay ich habe das mysql_select_db wirklich vergessen. Das kam aber auch daher, da ich das heut Morgen geschrieben habe, wo ich sowieso schon im Zeitdruck war, aber naja. Mein Fehler.

Was du nun für eine Funktion nutzt ist egal, aber du musst sehen, dass diese Funktion "deprecated" ist und somit schon bald aus den PHP-Versionen rausfliegen wird, da Zend/PHP angekündigt hat Codeoptimierungen vorzunehmen sowie Aliases und deprecated-Funktionen zu entfernen.

Denn in Deinem Vorschlag wurde immer noch das SQL- Statement gefüllt, bevor das Formular abgeschickt wurde ...

Hä? Es wird doch zuvor if(isset(...)) abgefragt, wie sollte denn dann das ganze abgefragt werden. Wenn du nun meinst, dass du nen Notice bekommst, dann solltest dir vllt. überlegen das $_POST['btnSpeichern'] mit einem @ versehen, denn lediglich die Variable ist nicht initialisiert.

<?php
// Wenn der Button speichern gedrueckt wurde
if (isset($_POST['btnSpeichern']))
{
$strHost = "Server"; // Sollte locahlhost sein
$strUsername = "Benutzername";
$strPW = "Passwort";
$strDBName = "Datenbankname";

// Verbindung zum Datenbank-Server herstellen
$strServer = @mysql_connect($strHost, $strUsername, $strPW) or die("Verbindung zur Datenbank fehlgeschlagen");

// Datenbank auswählen
@mysql_select_db($strDBName) OR die(mysql_error());

$insert_sql= "INSERT INTO angebot SET";

if(!empty($_FILES['bild']['name']))
{
$insert_sql.=" bild='/images/".mysql_escape_string($_FILES['bild']['name'])."'";
}
if(!empty($_FILES['bild']['name']))
{
$test = move_uploaded_file($_FILES['bild']['tmp_name'], $uploaddir . $_FILES['bild']['name']);
}
$insert_sql.=", content='".mysql_escape_string($_REQUEST['content'])."'";

// SQL- Statement ausführen und bei einem Fehler die MySQL- Fehlermeldung ausgeben
$Ergebnis = mysql_query($insert_sql) or die (mysql_error());
}

?>[/php]

Geschrieben
<?php

$insert_sql = "INSERT INTO angebot SET";
$insert_sql .= " content='".htmlentities($_REQUEST['content'], ENT_NOQUOTES)."'";
if(!empty($_FILES['bild']['name'])){
$insert_sql.=", bild='/images/".$_FILES['bild']['name']."'";
}

if(!empty($_FILES['bild']['name'])){
$test = move_uploaded_file($_FILES['bild']['tmp_name'], $uploaddir . $_FILES['bild']['name']);
}

?>[/php]

wobei ich da noch mysql_real_escape_string() bzw. mysql_escape_string() empfehlen würde.

Und wie schon zuvor gesagt würde, nutz lieber $_POST dafür ($_GET geht nicht, weils ja nen Upload ist!)

Ihr müsst zwischendurch auch auf die Leerzeichen etc. schauen.

Aber ich finde es interessant, wie lange ihr doch braucht um jemandem zu helfen. Statt dem immer zu sagen, was er denn anders machen könnte, oder sonstwas solltet ihr ihm besser mal helfen.

Es ging um das da und nicht um die von mir bereits korregierte Fassung.

Meine Schreibweise und Variablenbenamsung ist übrigens durch die Konventionen in meiner Firma entstanden also mache ich mir keine Gedanken darum, dass Du damit nicht klar kommst. Im Übrigen initiiere ich Variablen auch in php vor und dahinter steht immer ein Kommentar, was denn später in der Variablen stehen wird. Das war nur ein Codeauszug aus einem meiner Projekte.

Ich denke nicht, dass die Leute von php aus allen vorhandenen Versionen soetwas wie mysql_db_query rausnehmen werden und wenn doch dann muss ich fragen ob die ganzen Hoster auch diese geänderte Version beziehen wollen. Wenn man sich ansieht wie lange es dauert, bis ein großteil auf php5 umgestellt hat bzw. immer noch umstellt mache ich mir auch dann absolut keine Sorgen. Mit der Version mit der ich arbeite und die auch noch von Hostern eingesetzt wird, funktioniert mysql_db_query und diese Funktion ist nicht so exotisch, dass andere sie nicht erkennen bzw. deren Funktion verstehen können. Deswegen habe ich kein Problem damit das auch weiterhin einzusetzen.

Da es den anschein macht, dass Du gerade richtig den Durchblick hast, ziehe ich mich Mal aus diesem Thread zurück. Mitlerweile 7 Jahre php Erfahrung (und nebenbei auch in anderen Script- und Programmiersprachen) scheinen nicht zu reichen um mit Dir diskutieren zu können. Oder ich habe einfach keine Lust ,-(

Hoffe die Vorschläge haben den Threadersteller erreicht.

Geschrieben

Danke Leute, es hat funktionier.

zitat zu Hawkeye


Zudem kommt, dass Du immer noch keine Verbindung zur Datenbank herstellst.

habe ich auch gehabt:

<?php
include("./connect.php");
?>[/PHP]

ich hab nur Teil des Codes eingegeben.

Da habe ich sofort noch eine Frage:

wenn ich die Seite, aus welcher ich das Bild und den Text hochgeladen habe, noch mal aktualisiere, wird das gleiches Bild und Text noch einmal in der Datenbank gespeichert.

Mit welcher Funktion kann ich temporäres Verzeichnis löschen, damit es bei neuer Aktualisierung nichts mehr gespeichert wird.

Geschrieben

Hawkeye, du bist ja nen lustiger Vogel. Ich habe anscheind weniger Erfahrung wie du und du lässt dich durch mich aus dem Rennen kicken? Ich kenn mich auch in so einigen Programmier- und Skriptsprachen aus, nur versuche ich meinen Code so zu schreiben, dass Dritte den auch verstehen und nicht jeden Müll des Codes haben müssen. Wenn dein Unternehmen solche Richtlinien darstellt, dann wirds seine Gründe haben oder keine Ahnung haben.

Die Funktion mysql_db_query ist halt alt und auch umständlich, also was macht ihr da son Trubel drum? Willst du jedes mal den Namen der DB mitschleppen? Und was ist, wenn er zwischendurch geändert wird? Das ists schlecht.

@ Madmax:

Prüfe doch einfach ob die Datei schon vorhanden ist und/oder setze eine Session/Cookie mit dem Dateinamen. Nur ists ein wenig dumm, wenns zu Problemen kommt und ne Session/Cookie wird gesetzt.

Geschrieben
zitat zu freq.9

@ Madmax:

Prüfe doch einfach ob die Datei schon vorhanden ist und/oder setze eine Session/Cookie mit dem Dateinamen. Nur ists ein wenig dumm, wenns zu Problemen kommt und ne Session/Cookie wird gesetzt.

wie soll ich das machen? Habe, erlich zu sagen, keine Anung.

MfG max:rolleyes:

Geschrieben
wie soll ich das machen? Habe, erlich zu sagen, keine Anung.

MfG max:rolleyes:

<?php

/* ... */

if(!file_exists($uploaddir.$_FILES['bild']['name']))
{
// das zeug mit move_uploaded_file
}

/* ... */

?>[/php]

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...