09. november 2010 - 17:37Der 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)
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.
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. ''); }
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.
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.. :)
Hehe, det vigtigste er jo bare at du fandt en løsning :)
Synes godt om
Ny brugerNybegynder
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.