Avatar billede Junkuhn Nybegynder
09. november 2010 - 17:37 Der er 10 kommentarer og
1 løsning

Søg efter ";" i en string

Hej,


Jeg skal lave en if-sætning i PHP 5.2 som leder min variabel igennem, og ser om den indeholder et ";".
Det er dog lidt mere indviklet end det.

Min string er en samling filnavne som kommer fra en database i form af en enkelt string, med et ";" til at adskille navnene med.


Jeg kan godt finde de enkelte filnavne fra i min string, men jeg skal have scriptet til at se om filnavnet er efterfulgt af et ";". (altså om det er det sidste filnavn i rækken)



Et eksempel på hvad jeg skal bruge kunne være:



$string = "billede1.jpg;billede2.jpg;billede3.jpg;billede4.jpg";

if($filnavn er efterfulgt af et ";")
{
    echo "Det er ikke den sidste i rækken";
}
else
{
    echo "Det er den sidste i rækken";
}





På forhånd tak

/Frederik Junkuhn


PS: Hvorfor er der ikke en PHP kategori herinde? :)
Avatar billede arne_v Ekspert
09. november 2010 - 17:56 #1
Der er en PHP kategori. Den er gemt nede under Script.
Avatar billede arne_v Ekspert
09. november 2010 - 17:56 #2
Med hensyn til problemet: kan du ikke explode til et array og foreach'e over det?
Avatar billede Junkuhn Nybegynder
09. november 2010 - 18:17 #3
Hej,

Tak for det hurtige svar

Nej jeg kan desværre ikke bruge explode() i dette tilfælle..

Det er en del af et script som både sletter en fil i en mappe på serveren og skriver til en SQL base.

Essensen er at jeg henter mine filnavne ud fra basen, finder et af dem, og fjerner det fra min string, og skriver den nye string til basen. Samtidig sletter den billedet på serveren.

Som det er nu, finder den filnavnet og gemmer det i en variabel. Derefter klistre den bare et ";" på

$variabel = $variabel . ";";

Problemet er at hvis brugeren vælger at slette det sidste billede i rækken, skal der jo ikke være et ";" bag ved filnavnet.
Avatar billede webweaver Praktikant
09. november 2010 - 18:48 #4
Skal den vise det som en løkke som arne_v er inde på, hvor den skriver for hver fil den finder, om det er den sidste eller ej?

<?php

$string = "billede1.jpg;billede2.jpg;billede3.jpg;billede4.jpg";

$string = explode(";", $string);
$result = count($string);

$i = 0;

while(($i + 1) <= $result) {
   
    if (($i + 1) < $result) {
   
        echo $string[$i] . " - Det er ikke den sidste i rækken.<br>";
       
   
    } else {
   
        echo $string[$i] .  " - Det er den sidste i rækken.";
   
    }
   
    $i++;
}


?>
Avatar billede webweaver Praktikant
09. november 2010 - 18:51 #5
Nå du kunne ikke bruge explode() kan jeg se.

Hmm hvordan er din database struktur sat? Siden at du ikke bare har 1 billede i hver "bruger række"?
Avatar billede Junkuhn Nybegynder
09. november 2010 - 19:05 #6
Det er et billedalbum som brugeren opretter. (der kan oprettes flere album pr. bruger)

Basen har følgende felter:

id, albumTitle, descripttion, folder, images

I feltet "images" skrives alle filnavnene ind fra billederne adskilt af ";".

Jeg kan ikke lave et felt pr. billede da jeg ikke ved hvormange billeder brugeren uploader til det pågældende album. :)


Funktionen jeg forsøger at lave er redigering af et oploadet album. slette/tilføje billeder.


Her er scriptet:

if(isset($_GET['imageName']))
{
        //filnavn der skal slettes og albumID i SQL basen
    $imageName = $_GET['imageName'];
    $albumID = $_GET['albumID'];

    $conn = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die("There was a problem connecting to the database.");
                           
    $q = $conn->prepare("SELECT folder, images FROM albums WHERE id='{$albumID}' LIMIT 1");
    $q->execute();
    $q->bind_result($folder,$images);
    if($q->fetch())
    {
        $q->store_result();
        //Find filnavn der skal slettes i den string der kom fra SQL basen
        if(/*filnavn har et ; efter sig*/)
        {
            $imageName = $imageName;
        }
        else{
            $imageName = $imageName . ";";
        }
                //Slet filnavn fra string.
        $imgStr = str_replace($imageName,"", $images);           
       
        //Update SQL med den nye string
        $update = $conn->prepare("UPDATE albums SET images ='".$imgStr."' WHERE id='".$albumID."'");
        $update->execute();
            //Slet billede på serveren
        unlink("../albums/".$folder."/".$imageName);
    }
    header('Location: administration.php?albumID=' .$albumID. '');
}
Avatar billede webweaver Praktikant
09. november 2010 - 21:56 #7
Okay. Well jeg tænker lidt ovre i substr() funktionen så.
Der kan du tælle en string baglæns fra. Så kan du "tælle/registrere" det første tegn sidst i strengen, og lave en if sætning ud fra det.

$variabel = substr("abcdef", -1);

Den vil returnere "f". Eller i dit tilfælde, et semikolon.
Avatar billede Junkuhn Nybegynder
09. november 2010 - 21:58 #8
Aha!

Jeg fik løst problemet.


Problemet var at når jeg slettede et billede, fjernede den kun filnavnet fra basen, ikke det tilhørende ";" der adskilte filnavnene, således at der lige pludselig stod to ";;" ved siden af hinanden.

Dette klarede jeg med et simpelt str_replace(";;", ";", $string);

Når så man slettede det sidste billede i rækken, ville min $string ende med et ";".

strrev($string) vender min string om, og jeg tjekkede om det første tegn var et ";", hvis det var tilfællet, slettede jeg det med substr().



Jeg ved ikke om det er et unikt problem jeg har stået med, men jeg håber dette kan hjælpe andre herinde.. :)


Tak for forslagene :)
Avatar billede Junkuhn Nybegynder
09. november 2010 - 22:01 #9
Der var du lidt hurtigere end mig.. :)

Men jeg kan da godt se at jeg er gået over åen efter vand ved at vende min string om, og tage det første tegn, når jeg bare kan se på det sidste.. :)
Avatar billede Junkuhn Nybegynder
09. november 2010 - 22:07 #10
Fikset! :)
Avatar billede webweaver Praktikant
09. november 2010 - 22:08 #11
Hehe, det vigtigste er jo bare at du fandt en løsning :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester