PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : String aus url Variable verarbeiten


Carsten25
27.01.2004, 10:41:20
Hallo,

habe schon gestern und heute morgen nach einer Lösung gesucht aber komme nicht so richtig weiter.

Folgendes Problem:
So sieht die Variable in der URL aus:
http://www.meineurl.de/script.php?variable=12+35+26+53

Testausgabe im Script:
echo "$variable";
=
12 35 26 53

Möchte dieses haber im Format '12','35','26','53' für eine Mysql Abfrage haben. Wie ist das möglich ?

Habe es schon mit str_replace und einer Foreach schleife probiert.

Gruß
Carsten

feuervogel
27.01.2004, 12:18:06
hm, also am einfachsten bekommst du das mit explode() hin, denke ich

$pizza = "Teil1 Teil2 Teil3 Teil4 Teil5 Teil6";
$pieces = explode (" ", $pizza);

du kannst dann das array $pieces weiter verarbeiten.

Carsten25
27.01.2004, 13:57:56
Danke, hat funktioniert.

Für die Nachwelt:
$cat = explode (" ", $catnum);
$ergebnisstring="";
foreach ($cat as $val){
if($ergebnisstring==""){$ergebnisstring="'".$val."'";}
else{$ergebnisstring.=",'".$val."'";}}
echo "$ergebnisstring";

meikel (†)
27.01.2004, 18:34:45
Original geschrieben von Carsten25
12 35 26 53

Möchte dieses haber im Format '12','35','26','53' für eine Mysql Abfrage haben.
Das geht einfach:
$text = "'".str_replace (' ', "','", $text)."'";
Aus Gründen der Sicherheit rate ich allerdings davon ab, Formulardaten ungeprüft in SQL Strings zu verwenden.

Carsten25
27.01.2004, 21:27:29
Aus Gründen der Sicherheit rate ich allerdings davon ab, Formulardaten ungeprüft in SQL Strings zu verwenden. Keine Angst, sind keine Formulardaten ;).

Es geht darum das ich mehrere Kategorien anhand der Datensatznummer aufrufen möchte. Dies sollte in der zweiten mysql Abfrage passieren wo ich schon wieder bischen hänge. Ich bin halt kein Profi ;).

$result2 = mysql_query("SELECT catName FROM categories WHERE catnum IN(" .$ergebnisstring. ")");
while ($row2 = mysql_fetch_array($result2)) Also ich möchte mittels des Ergebnisstrings (Kategoriennummern) die Kategoriennamen aus der Datenbank abfragen. Diese sollten dann später auch in dem Format 'KAtegorie1','Kategorie2','Kategorie3', ... stehen.

Gruß
Carsten

chris17
27.01.2004, 21:41:26
Hi,

in wie fern unterscheiden sich die Werte in Feld catnum von dem Wert der Variable $ergebnisstring?

Wenn die gleich sind ->
$result2 = mysql_query("SELECT catName FROM categories WHERE catnum='".$ergebnisstring."'";
Falls $ergebnisstring nur in catnum enthalten ist->
$result2 = mysql_query("SELECT catName FROM categories WHERE catnum LIKE '%".$ergebnisstring."%'";

Gruss

Christian

Carsten25
27.01.2004, 22:06:17
Hallo Christian,

die sind nicht gleich. Es sollen halt nur die Kategorien anhand der catnum welche die nummern aus ergebnisstring enthalten ('12','13';..) abgefragt werden.

Die Abfrage funktioniert ja schon. Nur wie bekomme ich das Abfrageergebniss was hier in einem Array gespeichert wird wieder in das Format 'Kategorie1','Kategorie5',... . Oder wie muss ich den Array aufbereiten?

$result2 = mysql_query("SELECT catName FROM categories WHERE catnum IN(" .$ergebnisstring. ")");
while ($row2 = mysql_fetch_array($result2))

$ergebnisstring2="";
foreach ($row2['catname'] as $val2){
if($ergebnisstring2==""){$ergebnisstring2="'".$val2."'";}
else{$ergebnisstring2.=",'".$val2."'";}}
echo "$ergebnisstring2";

Bei dieser Lösung nimmt er die Foreach Schleife nicht an und gibt folgende Meldung aus:
Warning: Invalid argument supplied for foreach()

Gruß
Carsten

meikel (†)
27.01.2004, 23:14:19
Original geschrieben von Carsten25
Keine Angst, sind keine Formulardaten ;).
Angst habe ich nur bei meinen eigenen Daten. <ggg>
Es geht darum das ich mehrere Kategorien anhand der Datensatznummer aufrufen möchte. [...] Also ich möchte mittels des Ergebnisstrings (Kategoriennummern) die Kategoriennamen aus der Datenbank abfragen. Diese sollten dann später auch in dem Format 'KAtegorie1','Kategorie2','Kategorie3', stehen.
Wenn die Anzahl der unterschiedlichen Kategorien max 64 beträgt, lege ich Dir ans Herz, Dir den MySQL Datentyp SET genauer anzusehen, den Du gerade mühsam mit PHP nachbastelst.

Carsten25
28.01.2004, 01:18:53
Wenn die Anzahl der unterschiedlichen Kategorien max 64 beträgt, lege ich Dir ans Herz, Dir den MySQL Datentyp SET genauer anzusehen, den Du gerade mühsam mit PHP nachbastelst. [/B]

http://www.mysql.com/doc/de/SET.html

Nur werde ich daraus nich so richtig schlau. Wie verarbeite ich den mysql_query weiter?

Hier die Code Schnipsel:

$result2 = mysql_query("SELECT catName FROM categories WHERE set_catnum LIKE '%350%'");
$row2=mysql_fetch_row($result2);
//Habe ich aus den comments
$options=explode("','",preg_replace("/(enum|set)('(.+?)')/","2",$row2[1]));
echo "$options"; =FEHLER: Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in

Oder aus einem anderen Kommentar:



<?
/**
* @return array
* @param table DB table
* @param column Column name
* @desc Return an array of the possible values for a SET
*/
function get_set($table,$column)
{
$sql = "SHOW COLUMNS FROM $table LIKE '$column'";
if (!($ret = mysql_query($sql)))
die("Error: Could not show columns");

$line = mysql_fetch_assoc($ret);
$set = $line['Type'];
$set = substr($set,5,strlen($set)-7); // Remove "set(" at start and ");" at end
return preg_split("/','/",$set); // Split into and array
}
?>



Nur wie wende ich das jetzt auf mein Abfrage an?

Gruß
Carsten :confused:

meikel (†)
28.01.2004, 01:33:43
SET für Kategorien:
Original geschrieben von Carsten25
[B]http://www.mysql.com/doc/de/SET.html

Nur werde ich daraus nich so richtig schlau. Wie verarbeite ich den mysql_query weiter?
Beispiel:
CREATE TABLE tabelle (
id int(11) NOT NULL auto_increment,
name varchar(32) NOT NULL,
kat('kat1','kat2','kat3','kat4') default NULL,
PRIMARY KEY (`id`)
)
meier soll zu kat1 und kat3 gehören:
INSERT INTO tabelle (name,kat) VALUES ('meier', 'kat1,kat3');
Wenn Du alle Einträge suchst, bei denen kat1 und kat3 gesetzt sind:
SELECT * FROM tabelle WHERE FIND_IN_SET('kat1', kat) AND FIND_IN_SET('kat3', kat);
In der Ergebnistabelle stände dann:
$row['name'] = 'meier'
$riw['kat'] = 'kat1,kat3'

Ich verwende SET zB., um Userrechte zu verwalten.

Carsten25
28.01.2004, 09:46:54
Also wenn ich das dann richtig verstanden habe wäre Set auch nicht das richtige für mich.

Also wenn ich alle Kategorien z.B. mit den Id`s 12,55,68,95,152,563, ... haben möchte für jede Zahl den Befehl FIND_IN_SET ('wert', spalte) in den Mysql_query einfügen.
Wie ich schon geschrieben habe funktioniert ja die Abfrage der Ergebnisse schon. Ich möchte nur das Abfrageergebnis gerne wieder in einer weiteren mysql Abfrage einer anderen Tabelle nutzen. Dafür sollten dann die Kategorien Namen auch in dem Format 'Kategorie1','Kategorie2', ... sein.

Hier mal der Aufbau der Tabellen:
___________________________
|catnum__|catname__________|
============================
|1_______|Kategorie1_______|
|2_______|Kategorie2_______|
|3_______|Kategorie3_______|
|4_______|Kategorie4_______|
|5_______|Kategorie5_______|
|6_______|Kategorie6_______|
|7_______|Kategorie7_______|
|8_______|Kategorie8_______|
|9_______|Kategorie9_______|
|10______|Kategorie10______|
============================

Bei der ersten Abfrage möchte ich halt die Kategorien anhand der catnum abfragen was auch funktioniert.

___________________________________________
|ID_|item_____________|cat________________|
===========================================
|1__|Testartikel______|kategorie5_________|
|2__|testartikel_2____|Kategorie2_________|
|3__|Testartikel_4____|Kategorie6_________|
uws.

Hier möchte ich nun die Artikel anhand der Kategoriennamen herausfiltern. Dazu müssten aber die Kategorien aus der vorigen Abfrage in dem Fromat 'Kategorie1','Kategorie3', usw. stehen.

Gruß
Carsten

meikel (†)
28.01.2004, 14:41:39
Original geschrieben von Carsten25
Also wenn ich das dann richtig verstanden habe wäre Set auch nicht das richtige für mich.
Nur dann, wenn die Anzahl der Kategorien > 64 ist

Mit dem Datentyp SET organisiere ich nicht nur Userberechtigungen sondern auch ein Artikelsystem. Der Auftraggeber wollte, daß er Texte mehrfach unter verschiedenen Kategorien indizieren kann.

Ich würde Dir vorschlagen, das Prinzip erst mal zu testen. Ein gutes Datenbankdesign schüttelt man nämlich nicht aus dem Ärmel. Wobei ich damit nicht behaupten will, daß mein Vorschlag das Ei des Kolumbus wäre. Dazu weiß ich zuwenig vom Ziel der ganzen Übung. Auch sollte man überlegen, auf sogenannte fixe Tabellen (id -> Bezeichnung) zu verzichten und diese Daten in einem Array zu halten, weil das Array schneller gelesen ist, als der MySQL Server reagieren kann, wenn man ihn mit einem Monster-Join überfällt.