Anfängerfrage: In PHP MySQL-Abfrage mit Werten aus Array - Nur wie?

pyretta

Mitglied
Hallo,

ich bin noch recht frisch in PHP, bringe mir das gerade bei.

Um die Datenmenge einer MySQL-Abfrage auf das nötige Minimum zu reduzieren, dachte ich dass ich auf Werte eines Arrays, das ebenfalls aus einer MySQL-Abfrage stammt, zugreifen und so nur das aus der Datenbank fische, das ich auch wirklich brauche. Aber irgendwie krieg ich das nicht hin, und das was ich bisher im Internet dazu gefunden habe, half mir nicht wirklich weiter.

Meine erste Abfrage:
PHP:
//ARTIKEL-TEASER
$teaser = array();
$art_teaser = mysql_query("SELECT id,pid,tstamp,title,author,teaser,af_criteria,createdate FROM `tl_article` WHERE `af_enable`=1 AND `published`=1 ORDER BY title;") or die("Anfrage für 'tl_article' war nicht erfolgreich");
while($obj_teaser = mysql_fetch_object($art_teaser)) {	
	$teaser[] = $obj_teaser;
}

Meine zweite Abfrage (mit dem Versuch auf das "$teaser"-Array zuzugreifen, das aber nicht klappt, weil ich noch nicht verstehe wie es geht...):
PHP:
//ARTIKEL-INHALTE
$content = array();
$art_content = mysql_query("SELECT id,pid,type,text,headline,html FROM `tl_content` WHERE `invisible`='' AND `type` = 'text' OR `type` = 'html' OR `type` = 'headline' AND pid IN (".$teaser[]['id'].") ORDER BY pid;") or die("Anfrage für 'tl_content' war nicht erfolgreich");
while($obj_content = mysql_fetch_object($art_content)) {
	$content[] = $obj_content;
}

Die Struktur des Arrays "$teaser" sieht ungefähr wie folgt aus:
Code:
array(150) {
  [0]=>
  object(stdClass)#1 (8) {
    ["id"]=>
    string(3) "143"
    ["pid"]=>
    string(3) "135"
    ["tstamp"]=>
    string(10) "1358779568"
    ["title"]=>
    string(14) "Lorem Ipsum...."
    ["author"]=>
    string(1) "7"
    ["teaser"]=>
    string(1633) "Lorem Ipsum...."
    ["af_criteria"]=>
    string(106) "Lorem Ipsum...."
    ["createdate"]=>
    string(10) "1358696220"
  }, 
  [1]=>
  object(stdClass)#2 (8) {
    ["id"]=>
    string(3) "143"
    ["pid"]=>
    string(3) "135"
    ["tstamp"]=>
    string(10) "1358779568"
    ["title"]=>
    string(14) "Lorem Ipsum...."
    ["author"]=>
    string(1) "7"
    ["teaser"]=>
    string(1633) "Lorem Ipsum...."
    ["af_criteria"]=>
    string(106) "Lorem Ipsum...."
    ["createdate"]=>
    string(10) "1358696220"
  }
....}

Ich glaube dass ich grundsätzliche Verständnisprobleme habe, wie ich überhaupt an den Wert "id" rankomme.
Oder ist mein Denkansatz sowieso falsch und man löst das Problem besser ausschließlich in MySQL ohne die Krücke über das Array der ersten Abfrage? Aber wenn, wie mach ich das denn?

Könnt Ihr mir helfen und erklären, wie ich sowas lösen kann?
Würde mich wirklich sehr freuen. Vielen Dank.

Liebe Grüße,
pyretta
 
(1) ich könnt mir vorstellen, dass ein "Fehler" in den Bedingungen liegt. AND und OR muß wohl sinnvoll geklammert werden.
Code:
WHERE `invisible`='' AND `type` = 'text' OR `type` = 'html' OR `type` = 'headline' AND pid IN (1,2,3,4)
(2) Zudem ist diese pid IN-Geschichte nicht ganz zufriedenstellend gelöst, wie soll das aussehen? Ich gehe davon aus, das MySQL eine kommagetrennte Liste haben will, Du aber nur ein Array übergibst (und das auch nicht richtig, siehe druckos Beitrag)
(3) pack Deine Query erstmal in eine Variable, so dass Du sie als echo $query; mal ausgeben kannst, vielleicht fällt Dir dann ein Fehler auf.
(4) Vielleicht nimmst Du anstatt mysql_fetch_object() erstmal mysql_fetch_array()
PHP:
$querystring ="Hier Deine Query";
$art_content = mysql_query($querystring);
while ($row = mysql_fetch_array($art_content, MYSQL_ASSOC)) {
	echo "<pre>"; var_dump($row); echo "</pre>"; 
}
http://php.net/manual/de/function.mysql-fetch-array.php

mfg chmee
 
Hi,

Code:
... AND pid IN (".$teaser[]['id'].") ORDER BY ...
Der Index des Arrays muss mit angegeben werden! Du hast jetzt in $teaser[0]["id"] und in $teaser[1]["id"] usw. Daten, das kannst du nicht einfach leer lassen!

Und beherzige die Tipps von chmee :)

MfG
 
Vielen Dank euch beiden :)

Das sind ja schon mal viele Tipps und Hinweise. Vielen Dank. :)
Das mit dem "mysql_fetch_array" statt "mysql_fetch_object" geht leider nicht, da ich die arrays später in eine JSON-Datei überführen möchte. Oder geht das dann doch?

Ich weiss nicht ob ich sonst alles so recht verstanden habe, aber ich hab einfach mal versucht die IDs in ein weiteres Array zu überführen und das auszugeben. Hat aber auch nicht geklappt.
PHP:
$teaser_id_array = array();

//ARTIKEL-TEASER
$teaser = array();
$art_teaser = mysql_query("SELECT id,pid,tstamp,title,author,teaser,af_criteria,createdate FROM `tl_article` WHERE `af_enable`=1 AND `published`=1 ORDER BY title;") or die("Anfrage fuer 'tl_article' war nicht erfolgreich");
while($obj_teaser = mysql_fetch_object($art_teaser)) {	
	$teaser[] = $obj_teaser;
	$teaser_id_array[] = $obj_teaser->id;
}

//ARTIKEL-INHALTE
$content = array();
$content_pid = implode($teaser_id_array);
$art_content_select = "SELECT id,pid,type,text,headline,html FROM `tl_content`, `tl_article` WHERE `invisible`='' AND `type` = 'text' AND pid IN (". $content_pid .") ORDER BY pid;";
$art_content_query = mysql_query($art_content_select) or die("Anfrage fuer 'tl_content' war nicht erfolgreich");
while($obj_content = mysql_fetch_object($art_content_query)) {
	$content[] = $obj_content;
}


Dann hab ichs mal einfach mit einer verschachtelten MySQL-Abfrage versucht, da ich das hier gelesen habe: http://dev.mysql.com/doc/refman/5.1/de/subqueries.html:

PHP:
$art_content_select = "SELECT id,pid,type,text,headline,html FROM `tl_content`, `tl_article` WHERE `invisible`='' AND (`type` = 'text' OR `type` = 'html' OR `type` = 'headline') AND pid IN (SELECT id FROM `tl_article` WHERE `af_enable`=1 AND `published`=1) ORDER BY pid;";

$art_content_query = mysql_query($art_content_select) or die("Anfrage fuer 'tl_content' war nicht erfolgreich");

Aber irgendwie funktioniert das alles nicht, mir wird immer "Anfrage fuer 'tl_content' war nicht erfolgreich" angezeigt.

Wie kann ich denn nun eigentlich auf die Werte von "$teaser ID" zugreifen?
Oder wie kann ich meine MySQL-Abfrage richtig machen?

Bin wirklich noch blutiger Anfänger, was man besonders bei solchen Dingen sehr merkt.
 
Zuletzt bearbeitet:
SQL benötigt die IDs für IN(...) kommagetrennt, sprich
PHP:
$content_pid = implode(', ', $teaser_id_array);

Übrigens wenn du an deine Fehlerausgabe noch mysql_error() anhängst, bekommst du Informationen zum Fehler!
... or die("Anfrage fuer 'tl_content' war nicht erfolgreich. MySQL Fehler: ".mysql_error());

PHP:
//ARTIKEL-TEASER
$teaser = array();
$art_teaser = mysql_query("SELECT id,pid,tstamp,title,author,teaser,af_criteria,createdate FROM `tl_article` WHERE `af_enable`=1 AND `published`=1 ORDER BY title;") or die("Anfrage fuer 'tl_article' war nicht erfolgreich".mysql_error());

while($obj_teaser = mysql_fetch_object($art_teaser)) {    
    $teaser[] = $obj_teaser;
    $teaser_id_array[] = $obj_teaser->id;
}
// an dieser Stelle mal geschaut was in $teaser_id_array drin ist?
var_dump($teaser_id_array);

MfG
 
Vielen Dank drucko! :)

Jetzt hab ich eine Error-Ausgabe die mir folgendes sagt: "Column 'id' in field list is ambiguous". Aber genau das will ich doch auch oder nicht?

Das
PHP:
var_dump($content_pid);
gibt mir auch völlig richtig folgendes aus:

"138, 143, 87, 68, 69, 71, 70, 98, 95, 100, 67, 140, 79, 76, 66, 62, 82, 81, 127, 117, 129, 128, 84, 137, 144, 139, 150, 75, 78, 116, 146, 147, 149, 83, 142, 80, 77, 148, 125, 86, 85, 94, 92, 89, 90, 97, 96, 91, 126, 88, 130, 74, 73, 72, 118, 114, 115"

Also alle IDs mit Kommas getrennt. Also genau was ich für das "IN" brauche, oder nicht?

Das
PHP:
var_dump($teaser_id_array);
gibt mir folgendes aus:

array(57) { [0]=> string(3) "138" [1]=> string(3) "143" [2]=> string(2) "87" [3]=> string(2) "68" [4]=> string(2) "69" [5]=> string(2) "71" [6]=> string(2) "70" [7]=> string(2) "98" [8]=> string(2) "95" [9]=> string(3) "100" [10]=> string(2) "67" [11]=> string(3) "140" [12]=> string(2) "79" [13]=> string(2) "76" [14]=> string(2) "66" [15]=> string(2) "62" [16]=> string(2) "82" [17]=> string(2) "81" [18]=> string(3) "127" [19]=> string(3) "117" [20]=> string(3) "129" [21]=> string(3) "128" [22]=> string(2) "84" [23]=> string(3) "137" [24]=> string(3) "144" [25]=> string(3) "139" [26]=> string(3) "150" [27]=> string(2) "75" [28]=> string(2) "78" [29]=> string(3) "116" [30]=> string(3) "146" [31]=> string(3) "147" [32]=> string(3) "149" [33]=> string(2) "83" [34]=> string(3) "142" [35]=> string(2) "80" [36]=> string(2) "77" [37]=> string(3) "148" [38]=> string(3) "125" [39]=> string(2) "86" [40]=> string(2) "85" [41]=> string(2) "94" [42]=> string(2) "92" [43]=> string(2) "89" [44]=> string(2) "90" [45]=> string(2) "97" [46]=> string(2) "96" [47]=> string(2) "91" [48]=> string(3) "126" [49]=> string(2) "88" [50]=> string(3) "130" [51]=> string(2) "74" [52]=> string(2) "73" [53]=> string(2) "72" [54]=> string(3) "118" [55]=> string(3) "114" [56]=> string(3) "115" } string(250)

Jetzt verstehe ich überhaupt nicht mehr warum es jetzt nicht funktioniert. Eigentlich müsste es doch durch das Hinzufügen des Kommas hier: "$content_pid = implode(', ', $teaser_id_array);" funktionieren?


EDIT:

1. Ich bin blöd :rolleyes: :D
2. Ich hab zwei Tabellen angesprochen, wobei ich ja nur eine bräuchte... Dadurch gibt es eben eine Dopplung der ID-Werte (logisch, weil sind ja auch doppelt vorhanden wenn man beide Tabellen einliest :rolleyes: ...)

Falscher Code:
PHP:
$art_content_select = "SELECT id,pid,type,text FROM `tl_content`,`tl_article` WHERE `invisible`='' AND `type` = 'text' AND pid IN (". $content_pid .") ORDER BY pid;";

Richtiger Code:
PHP:
$art_content_select = "SELECT id,pid,type,text FROM `tl_content` WHERE `invisible`='' AND `type` = 'text' AND pid IN (". $content_pid .") ORDER BY pid;";

Und jetzt funktionierts auch.

Vielen, vielen Dank nochmal euch beiden - auch für eure Geduld. :)
 
Zuletzt bearbeitet:
Zurück