Zum Inhalt springen

php probleme in mysql lösen z.B. replace

Erstellt am 1. Juli 2008 · 9 Antworten · letzte Antwort am 2. Juli 2008

Tags: Frage

sefer ·

Hi,

nun löse ich die ganze zeit meine Probleme mit php anstatt mit mysql. Aber ein Tip von laser brachte mich eigentlich auf die richtige fährte nur weiß ich nicht wie ich das machen soll. Hab schon gesucht aber nix gescheites gefunden.

Also mein Aktuelles problem:
In der Tabelle(tx_teams) habe ich ein Feld(players) mit diesem inhalt
(2,11,12,13,14,15,16,17,18,19,20,22,23,24).
Nun möchte ich das der user mit der ID=2 auf einen link klickt und seine ID wird entfernt.
Das Ergebnis sollte so aussehen:
( 11,12,13,14,15,16,17,18,19,20,22,23,24).

Mit meine bisherigen Fähigkeiten hätte ich in php dies so gemacht(bitte nicht lachen):
1.)Felddaten als sting ermitteln (SQL)
2.)Feld per explode zum array machen
3.)Mit array_search das indizes im array ermitteln, falls vorhanden
4.)mit array_slice das gefunden indizes löschen
5.)aus dem array einen string machen
6.)in das FEld in der tabell schreiben (SQL)

Doch jetzt dürft ihr lachen und mir den entsprechenden Code für die SQL Abfrage liefern und wie man das in php formuliert
Ciao'
Sefer

UM Daten aus der DB auszulesen benutze ich diese Funtkion:

<?php
function getItem($field, $table, $where, $groupBy, $orderBy, $limit){
   	$rows=array();
    // function exec_SELECTquery($select_fields,$from_table,$where_clause,$groupBy='',$orderBy='',$limit='')
    if($res = $GLOBALS["TYPO3_DB"]->exec_SELECTquery($field, $table, $where, $groupBy, $orderBy, $limit)){		
		while($row = mysql_fetch_assoc($res)){
			$rows[]=$row;
		}		
	}else{
		$rows='false';		
	}
	//print_r($rows);
	return $rows;
}
?>
sefer ·

Danke Georg,

somit entfallen schonmal die Schritte 2-5:

<?php
        function rmFromList($element,$list)     {
                 $items = explode(',',$list);
                 while(list($k,$v)=each($items)) {
                         if ($v==$element)       {unset($items[$k]);}
                 }
                 return implode(',',$items);
         }
?>

Aber vielleicht gibt es eine direktere Methode in MYSQL.

mfg
Sefer

typo3tester ·

Ich würde mal versuchen, zwei REPLACE hintereinander zu schalten.
Ich unterstelle folgendes:
Es muß entweder 2, oder 2) ersetzt werden, weil Deine ID im String oder am Ende vorkommen kann.

Also muß ich den REPLACE verschachteln:

SELECT REPLACE( REPLACE( '(2,11,12,13,14,15,16,17,18,19,20,22,23,2)', '2,', '' ) , ',2)', ')' )

Zur Verdeutlichung habe ich jetzt einfach mal die letzte Zahl auch 2 genannt um beide Fälle abzudecken.

Bei mir auf der MySQL hat's gerade geklappt, ich bin mir nur gerade nicht sicher, ob ich zu kurz gedacht habe und es noch irgendwelche Sonderfälle zu bedenken gibt.
Info zum String-Replace mit mysql gibts hier:

http://dev.mysql.com/doc/refman/5.1/de/string-functions.html

Gruß, Regina

laser ·

Mal was allgemeines, wieso speicherst du überhaupt alle Spieler in einer Spalte? Wäre es nicht schlauer irgendwie ne MM-Relation zu erstellen? Dann hättest du es viel einfacher und meiner Meinung auch performanter

sefer ·

Erstmal danke für die anworten,

@laser
Die Spalte ist von der extension t3sports vorgegeben, wenn ich die Spieler hier nicht speicher, dann kann im Hintergrund einiges nicht berechnet werden.

Wobei, ich schon ein logging (tbl_mm_logging)durchführe und hier die mm_relation habe. Allerdings ist es für mich viel einfacher und bei tausenden von Usern viel schneller ein einzelnes bestimmtes Feld zu lesen als ein join in der Tabelle durchzuführen.

Außerdem weiß ich auch noch nicht was ich in meiner "tbl_mm_logging" mache, wenn der Spieler von der Mannschaft gelöscht wird. Das wird doch zu kompliziert und durcheinenander, aber mm-Relation ist schon eine schöne Sache, damit kann man einiges viel einfacher machen.

Jetzt bin ich gerade dabei noch ein Feld für den Spieler anzulegen und hier auch die Teams zu speichern in denen er bisher gespielt hat (Teamhistorie). Die Teams werden wieder kommasepariert angelegt, wäre wieder selbes problem wie oben, aber so kann ich auch immer sehen in welchen Teams der Spieler gespielt hat.

@typo3tester
Ja den Befehl mit REPLACE hatte ich schon auf der MYSQL-Seite gefunden. ich habe nur keine Ahnung, wie ich diesen in mein Code einfüge und auf die richtige Tabelle anwende, da haperts an MYSQL kenntnissen.
MAche ich das mit exec_SelectQuery, dann kann ich ja meine Funktion
getitem($field, $table, $where, $groupBy, $orderBy, $limit) {.... return $rows;}
vom ersten Post nehmen.
Wie lautet der ganze SQL-Statement, wo kommt das REPLACE hin?
Eingangswerte:$UserID=2 und $id_team=7

$field='players';
$table='tx_teams';
$where='uid_team='.$id_team;
$rows=$this->getitem($field, $table, $where, $groupBy, $orderBy, $limit);

Bei mir auf der MySQL hat's gerade geklappt, ich bin mir nur gerade nicht sicher, ob ich zu kurz gedacht habe und es noch irgendwelche Sonderfälle zu bedenken gibt.

Ja, bin deiner Meinung. Die Sonderfälle muss ich dann testen.

danke,Sefer

steffenk ·

Achtung, der Replace ist unvollständig, er ersetzt z.B. auch ...,12,

Ich halte das für keine brauchbare Lösung (müsste mind. 4fach verschachtelt sein) und würde immer den php-Weg wählen, so wie in genannter php-Funktion.

typo3tester ·

Jo steffenk hat recht, ich wußte doch, daß ich irgendwo zu kurz gedacht hatte. :o

Einzubauen wäre es mit einem Update:

Update Deine_Tabelle set spalte_wo_ersetzung stattfindet = replace(...spalte_wo_ersetzung stattfindet...)

Gruß, Regina

sefer ·

Danke, für die Antworten!

Reginas Tip werde ich mal durchchecken, damit kann man bestimmt was anfangen, falls nicht hier, dann ein ähnliches Problem.

Der Tip(rmFromList) von Georg ist aber Gold Wert. Ich muss mal die API durchlesen, da ist schon ne Menge enthalten.

Ich markiere mal als gelöst! :p

Ciao'
Sefer