Datensatz in Textarea ausgeben

Fabian Frank

Erfahrenes Mitglied
N'abend,

so, hab versucht eine ganz normale ausgabe zu gestalten, was jedoch unmöglich scheint, wenns dennoch so einfach ist.

Und zwar hab ich eine Datei, in der per Hidden-Feld Daten an eine zweite weitergegeben werden:

Code:
<input name='newseintrag' type='hidden' value='$newsentry->zeit'>

Die werden auch weitergegeben, wie ein echo-Befehl bestätigt, jedoch bring ich es einfach nicht fertig, trotz blättern in Büchern, lesen von was weiß der Himmel wievielen Internetseiten mit Dokumentationen die Daten in einen Textbereich auszugeben :-P

Problem ist folgender Code:
PHP:
<textarea name="news_eintrag" cols="50" rows="15">
<?php 
	$connectionid  = mysql_connect ("localhost", "********", "********");
	if (!mysql_select_db ("********", $connectionid)) 

{ 

  die ("Verbindung zur Datenbank fehlgeschlagen."); 

} 
	$newseintrag = $_POST['newseintrag'];
	$sql_news=mysql_query('SELECT `news`, `zeit` FROM news WHERE zeit = $newseintrag');
 	$ergebnis=mysql_query($sql_news) OR die(mysql_error());
	$row=mysql_fetch_assoc($ergebnis);
	echo($row['news']);

	?></textarea>

Es erscheint dann gütigerweise folgende Fehlermeldung:

Toll. :-D

Hm, weiß nicht mehr was ich machen soll.
Kann mir bitte einer sagen, worin der Fehler in dem Code liegt?

Viele Grüße und ein dickes Danke im Vorraus,

Fabian
 
Ich mag dieses extreme Gepansche von Verarbeitung und Ausgabe nicht :D

Zuerst Daten verarbeiten, dann ausgeben - Dient vor allem der Struktur und Übersichtlichkeit.

Erstmal aber zum eigentlichen Problem:
a) Es gehört eventuell eher ins PHP-Unterforum,
b) Ich schlüssele mal auf:
PHP:
    $sql_news=mysql_query('SELECT `news`, `zeit` FROM news WHERE zeit = $newseintrag');
     $ergebnis=mysql_query($sql_news) OR die(mysql_error());
ist identisch zu
PHP:
$ergebnis = mysql_query(
        mysql_query('SELECT `news`, `zeit` FROM news WHERE zeit = $newseintrag')
    ) ||
    die( mysql_error() );

Fällt etwas auf? Richtig, ein Queryresultlink ist kein String sondern eine Resource, die beim magic Typecasting auf String identisch zu null angesehen wird, demzufolge gilt:
PHP:
$ergebnis = mysql_query( null );
// oder auch
$ergebnis = mysql_query( (String) null );

Kein Wunder also, dass das Query leer ist. Was also tun? Unnötigen Kram entfernen und ein bisschen mehr Whitespaces gebrauchen (Dadurch werden die Tokens auch für das menschliche Auge erkennbarer). Ich gebe zu, in der Hinsicht übertreibe ich es immer, aber neben binären Operatoren kann doch immer mal ein Leerzeichen stehen ;)

Und was das EVA-Prinzip betrifft:
PHP:
<?php 
$connectionid = mysql_connect ("localhost", "********", "********");
if ( !mysql_select_db ("********", $connectionid) ) {
  die ("Verbindung zur Datenbank fehlgeschlagen."); 
}
// Überprüfen, ob Feld gesetzt, wenn ja caste nach Integer
$newseintrag = isset( $_POST['newseintrag'] ) ? (int) $_POST['newseintrag'] : 0;

// Query erfolgreich absetzen oder "sterben"
( $ergebnis = mysql_query('SELECT `news`, `zeit` FROM news WHERE zeit = $newseintrag') ) || die( mysql_error() );

// Wenn mehr als 0 Resultate...
if ( mysql_num_rows($ergebnis) > 0 ) {
    // fetche und weise zu
    $row = mysql_fetch_assoc($ergebnis);
    $news = $row['news'];
} else {
    // leeren String anlegen
    $news = "";
}

// Und nun die Ausgabe
?>
<textarea name="news_eintrag" cols="50" rows="15">
<?php echo htmlspecialchars($news); ?>
</textarea>
 
Aloha,

danke für die ausführliche Antwort!

Leider gibt es noch ein kleines Problem.

Code:
 Unknown column '$newseintrag' in 'where clause'

Erscheint bei dem Code.
Ich hab mal vor das $newseintrag ein " (dahinter ebenfalls), dann ist die Fehlermeldung weg, jedoch ist dann eine Leere Textarea vor mir :-D
 
Versuch es einfach mal andersrum: String in PHP double quoted, String in Statement / Query single qouted. Habe da natürlich oben selbst nicht drauf geachtet.

Anlass für Strings mit doppelten Anführungszeichen in PHP ist in der Dokumentation nachzulesen. Das zumindest sollte klarstellen, warum in diesem Fall doppelte Anführungszeichen vorzuziehen sind, denn:

PHP:
<?php
$var = "Lorem Ipsum";
var_dump( 'Output: $var' );
// >> "Output: $var"
var_dump( "Output: $var" );
// >> "Output: Lorem Ipsum"

Noch eine kurze Erklärung von wegen Unknown column '$newseintrag' in 'where clause'... Strings in MySQL werden generell mit doppelten oder einfachen Anführungszeichen gekennzeichnet, Zahlen werden als Zahlen identifiziert, wenn sie nur aus "numerischen" (ich schließe in diesem Fall Punkt und Komma ein) Zeichen in einer entsprechenden Zusammenstellung existieren. Spalten- und Tabellennamen in MySQL sind Zusammensetzungen aus Alphanumerischen Zeichen und einer Anzahl von Sonderzeichen. Die Bezeichnungen kann man meist ohne Ticked Quotes schreiben - das sind diese hier: "`" - manchmal aber muss ein Bezeichner als solches erkennbar gemacht werden mit eben jener Kennzeichnung.
Findet de MySQL-Parser also ein Token, welches kein Datentyp aber auch kein Schlüsselwort ist, vermutet man einen Bezeichner für eine Spalte oder Tabelle. Im ersten Anlauf hat man also nach einer Spalte mit der Bezeichnung "$newseintrag" gesucht, als du es in Anführungszeichen gesetzt hast, wurde mit einem String (oder gecastete Zahl, falls mit Zahlenwerten verglichen wird) verglichen.

Ist schon etwas früh, deshalb hoffe ich umso mehr, dass ich mich noch verständlich ausdrücken konnte.

Zum Vergleich: Folgende drei Ausdrücke führen grundsätzlich zu gleichen Ergebnissen.
PHP:
$ergebnis = mysql_query( "SELECT `news`, `zeit` FROM news WHERE zeit = '$newseintrag';" );
// oder
// (funktioniert nur bei Zahlenwerten, da ohne Stringkennzeichnung!)
$ergebnis = mysql_query( "SELECT `news`, `zeit` FROM news WHERE zeit = $newseintrag;" );
// oder
// (funktioniert auch nur bei Zahlenwerten, da ohne Stringkennzeichnung!)
$ergebnis = mysql_query( 'SELECT `news`, `zeit` FROM news WHERE zeit = ' . $newseintrag . ';' );
// oder
$ergebnis = mysql_query( 'SELECT `news`, `zeit` FROM news WHERE zeit = \'' . $newseintrag . '\';' );
 
Hallo,

ging ja schnell. Musste mich letztendlich heut früh dann doch dazu entscheiden, schlafen zu gehen. Naja...

Hab mich eine halbe Stunde damit beschäftgigt und komm eigentlich ganz gut zurecht. Das mit den Doublestrings hab ich verstanden, bezüglich PHP.

Jetzt bin ich zu dem Entschluss gekommen, dass der Code wie folgt aussehen muss, da ansonsten ja nur Zahlenwerte funktionen. (Nach den 4 verschiedenen querys):
PHP:
// Überprüfen, ob Feld gesetzt, wenn ja caste nach Integer
$newseintrag = isset( $_POST["newseintrag"] ) ? (int) $_POST["newseintrag"] : 0;

// Query erfolgreich absetzen oder "sterben"
( $ergebnis = mysql_query( "SELECT `news`, `zeit` FROM news WHERE zeit = '$newseintrag';" ) ) || die( mysql_error() );

// Wenn mehr als 0 Resultate...
if ( mysql_num_rows($ergebnis) > 0 ) {
    // fetche und weise zu
    $row = mysql_fetch_assoc($ergebnis);
    $news = $row['news'];
} else {
    // leeren String anlegen
    $news = "";
}

// Und nun die Ausgabe
?>
<textarea name="news_eintrag" cols="50" rows="15">
<?php echo htmlspecialchars($news); ?>
</textarea>

Nur irgendwie erscheint jetzt wieder eine leere Textarea. Ist schon mal ein Fortschritt im Vergleich zu den Fehlermeldungen, bloß ich bin halt irgendwie leider im Umgang mit PHP-Mysql nicht ganz so der, der sich auskennt...
 
Sofern du eine Software wie zB phpMyAdmin benutzt, solltest du einfach mal ein Testcase entwerfen (also ein Query mit statischen Werten füllen) und dieses testen. Sollte so weit der Test funktionieren, kannst du das Query entsprechend in PHP einbinden und dynamisch gestalten.
Relevant könnte bei Strings die [phpf]mysql_real_escape_string[/phpf] werden, da eventuelle Anführungs- und ein paar Sonderzeichen Probleme bereiten können.

Nehmen wir mal dein Query hier:
SQL:
SELECT
    `news`,
    `zeit`
FROM
    `news`
WHERE
    `zeit` = '$newseintrag'
Realtiv einfache Übung (Beispiel):

SQL:
SELECT
    `news`,
    `zeit`
FROM
    `news`
WHERE
    `zeit` = UNIX_TIMESTAMP( '2007-12-24 18:00:00' ) /* fiktiver Wert zur Verdeutlichung */

Das zeigt dann auch schon, was du selbst von dem Query halten willst; Und was du davon zu halten hast, kannst du mittels [phpf]var_dump[/phpf] nach Übergabe des Querystrings herausfinden.

Eine Frage: Warum eine Spalte als Indizierung verwenden, die Daten beinhaltet, die womöglich doppelt vorkommen können? Eine eindeutige ID in Form einer Zahl oder eines Strings wäre evtl besser geeignet. Sprich: Warum nach "Zeit" filtern, wenn man eine triviale und schnelle Index-Spalte verwenden kann?
 
Hehe. Daran hab ich schon gedacht, jedoch schien mir das zu kompliziert.
Das eigentliche Problem ist gelöst, durch deine Idee, mit der Index-Spalte. Hab jetzt eine Spalte hinzugefügt die "ident" heißt, dort werden die Einträge mit nummern gespeichert.

Jedoch bleibt mir jetzt noch das Problem, wie ich diese Nummern bei jedem neuen Eintrag +1 hochsetze, damit nicht 2 dieselbe haben.

Momentanes Skript zum einfügen von neuen news:
PHP:
$topic = $_POST['Topic'];
$news = $_POST['News'];
$datum = date('d.m.Y H:i:s');


$sql = "INSERT INTO news
                (betreff, news, zeit)
            VALUES
               ('".$topic."',
                '".$news."',
                '".$datum."')";
$eintragen = mysql_query($sql);
    header ("Location: addnews.php?already=1");

Soll ich die Identvariable bereits im Formular auslesen und hochzählen, oder erst in dem "Eintrage-Skript"?
 
Lass sowas von MySQL automatisch erledigen:

SQL:
ALTER TABLE `news` CHANGE `ident` `ident` UNSIGNED INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT;

Ein Mal laufen lassen, und schon ist deine Ident-Spalte gewappnet: vorzeichenlose Integerzahlen, Primärschlüssel (Indexierung -> Schneller Zugriff) und automatische Inkrementierung in Einerschritten.

Das erspart Nebenläufigkeiten und weitere Probleme.

Noch ein paar Verbesserungsvorschläge:
PHP:
<?php
$topic = mysql_real_escape_string($_POST['Topic']);
$news = mysql_real_escape_string($_POST['News']);
$datum = time(); // Unix-Timestamps sollten in PHP bevorzugt werden, da eine spätere Manipulation oder Änderung leichter zu vollführen ist

$sql = "
    INSERT INTO `news` (
        `betreff`,
        `news`,
        `zeit`
    ) VALUES (
        '{$topic}',
        '{$news}',
        FROM_UNIXTIME('{$datum}')
    );";

Wichtig sollte von Anfang an sein, sicherere Scripte und Datenbankinteraktionen beschreiben zu können - Dazu gehören unter anderem Escape-Funktionen.
 
Kam leider schon wieder ein Problem:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNSIGNED INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT' at line 1

Tut mir leid, aber hab in den letzten 2 Tagen soviel dazu gelernt durch verbessern und so, dass mein Kopf jetzt total verrückt spinnt und meine Konzentration schon fast am ende is...
 
Zuletzt bearbeitet:
Da geht es dir ähnlich wie mir (auch wenn ich mich zum Glück nicht mehr mit den erweiterten Grundlagen rumschlagen muss ;) ). Finde nun selbst den Fehler nicht, deshalb ein bisschen anders:

SQL:
ALTER TABLE
    `news`
MODIFY
    `ident` UNSIGNED INT NOT NULL AUTO_INCREMENT,
ADD
    PRIMARY KEY ( `ident` );
 
Zurück