Problem mit Fetch() bei Prepared Statements

P

PHPFrage

Hallo,
ich möchte aus einer mysql Datenbank Einträge auslesen.
Ich benutze Prepared Statements und versuche die Einträge mit der Funktion fetch() auszulesen.
Allerdings erhalte ich dadurch alle Einträge doppelt. Ich habe gelesen dass es daran liegt dass er alle Werte auf zwei Weisen ausgibt und das man dies bei den Funktionen fetch_array() und so weiter durch extra parameter kontrollieren kann. Allerdings habe ich manual für die funktion fetch kein Parameter dafür gefunden.
Wie kann ich es schaffen dass alle Beiträge nur einmal ausgegeben werden? Habe schon alles durchgesucht aber nichts gefunden. Hier nochmal der Code falls es hilft.
Code:
		$sql = 'SELECT
					Content, message.Username, Date
				FROM
					User, message
				WHERE
					message.ReceiverID = ?
				ORDER BY
					Date DESC';
		$stmt = $db->prepare($sql);
		if (!$stmt)
		{
			die($db->error);
		}
		$stmt->bind_param('i', $ID);
		if(!$stmt->execute())
		{
			die($stmt->error);
		}
		$stmt->bind_result($Content, $Name, $Date);
		$stmt->store_result();
		if (!$stmt->num_rows)
		{
			echo 'Keine Nachrichten vorhanden';
		}
		else
		{
			while($stmt->fetch())
			{
				$Counter++;
				echo 'Von '.htmlspecialchars($Name).'<br />';
				echo htmlspecialchars($Date).'<br />';
				echo htmlspecialchars(nl2br($Content)).'<br />';
				echo '-----------------------------------------<br />';

			}
		}
 
Hallo Gast,

da die Kristallkugeln der meisten User entweder kaputt oder in der Reinigung sind, wird wohl kaum einer rausbekommen, was in den einzelnen Klassenfunktionen passiert.

Wenn ich in meiner Werkstatt anrufe und sage "Auto kaputt, was kostet?" werden die wohl auch doof aus der Wäsche gucken.

Aber mal ohne Quatsch, wer soll Dir sagen können (außer dem Scriptschreiber), warum die jedem unbekannte Funktion fetch() Werte doppelt liefert?

Das Einzige, was sich dazu sagen ließe, wäre, einen Zähler einzubauen und jede zweite Ausgabe zu unterbinden. Das löst zwar nicht das Problem, aber zumindest das in der Darstellung. Ohne die Klasse näher zu kennen, erschöpft sich da auch schon jeder Ratschlag.

Greetz
cw
 
Nicht ganz. $stmt scheint ein MySQLi_STMT-Objekt zu sein.

Das Problem liegt im Query selber. Da sind 2 Tabellen, die nicht miteinander verknüpft sind. Das gibt Anzahl(User)*Anzahl(Message der ID 'xy') Datensätze. Ich geh mal davon aus, dass im Moment 2 User erfasst sind....
Die 2 Tabellen müssen mittels JOIN oder WHERE noch verbunden werden.

SQL:
SELECT
    Content, message.Username, Date
FROM
    User, message
WHERE
    message.ReceiverID = ?
    -- So etwas wie die folgende Zeile fehlt
    AND User.userId = message.UserId
ORDER BY
    Date DESC
 
Zuletzt bearbeitet von einem Moderator:
Sorry,

hab grad gesehen, dass dieses stmp-Objekt öfter im Forum auftaucht, scheint also nicht gänzlich unbekannt. Da nehme ich bis auf meine Wenigkeit mal die Kristllkugeln zurück.

Nüscht für unjut
cw
 
$stmp kann alles sein. Da jedoch alle Funktionen die er da aufruft genaue der MySQLi_STMT-Klasse entspricht, gehe ich mal davon aus dass es auch genau das ist.
Zudem ist $db->prepare genau so wie die prepare-Methode von der Mysqli-Klasse, die ein MySQLi_STMT als Rückgabe hat.

Ergo meine Mutmassung
$db ist eine Instanz von MySQLi
$stmt ist eine Instanz von MySQLi_STMT

Die Kristallkugel hat schon seine Berechtigung.
 
Zuletzt bearbeitet:
Zurück