Zahlen aus einen String lesen



  • Hallo,

    ich bastel gerade an einer Buddylist.

    Die hinzugefügten Buddys werden in der SQL-TABLE, wo die Users gespeichert werden in einer extra Spalte namens "buddylist", die als TEXT definiert ist, gespeichert.

    Jetzt habe ich folgendes Problem:

    Ich lese die Buddylist mit einer SQL-Select-Anfrage aus und erhalte einen String mit den jeweiligen User-IDs, die in die Buddylist übernommen werden sollen.

    Beispiel: "1 2 3 10 32"

    Jetzt möchte ich einzelnen Zahlen aus dem String lesen. Dies habe ich wie folgt gemacht:

    $spacePosOffset = 0;
    	for( $i = 0; $i <= strlen( $getDataFromDB['Buddylist'] ); ++$i )
    	{
    		$spacePosLeft = strpos( $getDataFromDB['Buddylist'], " ", $spacePosOffset );
    		$spacePosOffset = strpos( $getDataFromDB['Buddylist'], " ", $spacePosLeft + 1 );
    		$spaceBuddyID = substr( $getDataFromDB['Buddylist'], $spacePosLeft, ( $spacePosOffset - $spacePosLeft) );
    		$viewBuddyList[$i] = $spaceBuddyID;
    		echo "Right: " . $spacePosOffset . "<br />\n";
    		echo "Array: " . $i . "=>" . $viewBuddyList[$i] . "<br />\n";
    	}
    

    Ausgeben tu ich die Buddys wie folgt:

    echo "<form name=\"FormListBuddys\" method=\"post\" action=\"index.php?site=buddylist&action=list\">";
    
    	foreach( $viewBuddyList as $buddyID )
    	{
    		// Buddyname aus BuddyID ermitteln
    		$sqlQuery = "SELECT
    					 	UserID,
    						Username
    					 FROM
    					 	users
    					 WHERE
    					 	UserID = '" . $buddyID . "'";
    
    		$sqlResult = mysql_query( $sqlQuery ) OR die( mysql_error() );
    		$getDataFromDB = mysql_fetch_assoc( $sqlResult );
    
    		// Buddyname anzeigen
    		echo "<input type=\"checkbox\" name=\"buddyID" . trim( $buddyID ) . "\">" . $getDataFromDB['Username'] . "<br />\n";
    	}
    	echo "<br />\n";
    	echo "<input type=\"submit\" name=\"buddyDel\" value=\"Löschen\">";
    	echo "</form>";
    

    Nun mein 1. Problem:
    - Die Buddys werden erfolgreich aufgelistet, abgesehen vom letzten Buddy. Dies liegt daran, da nach dem letzten Buddy kein Leerzeichen erfolgt und mein Algorithmus nach einem Leerzeichen sucht, was dann in $spacePosOffset gespeichert wird. Wenn ich das Leerzeichen manuell in PHPmyAdmin hinzufüge geht es. Eigentlich sollte das letzte Leerzeichen im String eigentlich schon vorhanden sein, da ich meinem Skript beim Hinzufügen des Buddys ja bereits sage, dass er immer ein Leerzeichen machen soll:

    $buddyList .= $getDataFromDB['UserID'] + " ";
    

    Mein 2. Problem besteht darin,

    dass er mir die Buddynamen 3 mal ausgibt. Dies liegt an der Bedingung meiner Forschleife:

    for( $i = 0; $i <= strlen( $getDataFromDB['Buddylist'] ); ++$i )
    

    Dort sag ich ja, dass die Schleife solange durchläuft, wie der String lang ist. Also zählt er natürlich auch die Leerzeichen mit.
    Ich finde keine passende Bedingung dafür, dass er sie nur solange durchläuft, wie die Anzahl der Zahlen ist.

    In PHP gibt es eine schöne String-Funktion str_word_count(), welche alle Wörter in einem Array speichert.
    Dies ist dasselbe Prinzip wie bei mir. Nur leider gibt es keine Funktion, die die Zahlen zählt.

    Zu anfangs habe ich die Funktion str_split() benutzt, und ihr gesagt, dass sie den String jeweils nach 2 Zeichen trennen soll. Nur leider funktioniert dies dann nur, wenn die ID einstellig ist.

    Kann mir jemand hierbei helfen, oder hat jemand einen besseren Vorschlag, wie ich das Problem lösen kann?

    Danke im Voraus.

    Gruß

    nki



  • Hallo,

    Du machst es dir viel zu kompliziert. Schau dir mal die Funktion explode() an 😉
    http://php.net/explode

    $buddies = '1 2 3 10 32';
    $buddies = explode(' ', $buddies);
    
    foreach($buddies as $buddy)   {
       echo $buddy, '<br />';
    }
    


  • Das Problem liegt eigentlich im Datenbankdesign. Verwende dafür einfach eine eigene Tabelle, im einfachsten Fall:

    user_id  | buddy
    1        | 3
    ...      | ...
    


  • $sqlQuery = "SELECT
                             UserID,
                            Username
                         FROM
                             users
                         WHERE
                             UserID = '" . $buddyID . "'";
    

    Wie lautet die URL der Seite? Die ist ja ein Paradies für angehende Hacker! Vom Feinsten unsicher. :D:D:D



  • Da wollte ich auch schon drauf hinweisen, aber ich dachte mir: Das sieht man hier in fast jedem geposteten Quellcode, also impliziere ich einfach mal, dass $buddyId genügend abgesichert und escaped wird 😉

    Wenn du das nicht voraussetzt, müsstest du in fast jedem Thread auf sql-Injection hinweisen 😞



  • árn[y]ék schrieb:

    Das sieht man hier in fast jedem geposteten Quellcode, also impliziere ich einfach mal, dass $buddyId genügend abgesichert und escaped wird 😉

    Erschreckender Weise wird dies bei PHP in über 95% der Fälle nicht gemacht! Hier muss man wirklich sagen: PHP verleitet den Coder regelrechten Müll zu entwickeln.

    Schnell in der Entwicklung, grottig auf Dauer. Auch das Fehlen einer anständigen MVC-Implementierung ist eine herrliche Fehler- und Angriffsquelle. Wenn ich eines schon nicht abhaben kann, dann ist es dieses grauenvolle Mischen von PHP-Code mit HTML-Code.

    Boah, manchmal bekomm ich auf PHP einen richtigen Hass 😃

    Mein Tipp an alle: Rubby, Java oder ASP.NET mit C# 🙂 Dort gibt es out-of-the-box viel weniger Sicherheitslücken 😉

    Grüße



  • Kenner des SQL schrieb:

    Schnell in der Entwicklung, grottig auf Dauer.

    Nur bei einem Entwickler, der keine Ahnung hat. Und so jemand sollte sich in keiner Sprache an sicherheitskritischen Anwendungen versuchen 😉

    Kenner des SQL schrieb:

    Wenn ich eines schon nicht abhaben kann, dann ist es dieses grauenvolle Mischen von PHP-Code mit HTML-Code.

    Interessanterweise wird gerade das von vielen PHP-Fachleuten als großer Vorteil genannt, da er die Entwicklung beschleunigt. Ich bin aber selbst auch der Meinung: Eine richtig gute Template-Engine sollte zum Standardumfang gehören. Oder zumindest Ansätze von einer Design- und Logiktrennung 😞

    Kenner des SQL schrieb:

    Boah, manchmal bekomm ich auf PHP einen richtigen Hass 😃

    Wem nicht 😉


Anmelden zum Antworten