Avatar billede sjh Nybegynder
26. november 2007 - 11:41 Der er 7 kommentarer og
1 løsning

Tjek to tabeller for et navn.

Jeg skal tjekke to tabeller for et filnavn.. Jeg har lave det så det virker men kan det ikke optimeres eller laves på en bedre måde end min SLAM SQL-String :D


  $Folder = "/www/image/";
  $delFile = "5a085b73de03ba6.jpg";

  $strSQL = "(SELECT post_id AS id FROM phpbb_posts_text WHERE post_text LIKE '%$delFile%' LIMIT 1) UNION
  (SELECT privmsgs_text_id AS id FROM phpbb_privmsgs_text WHERE privmsgs_text LIKE '%$delFile%' LIMIT 1);";

  $sqlResult = @mysql_query($strSQL, $sqlConn);
  if ($sqlResult && mysql_num_rows($sqlResult) == 0)
  {
    echo "delete";
    /* unlink($Folder.$delFile); */
  }
Avatar billede arne_v Ekspert
26. november 2007 - 19:49 #1
Det tror jeg ikke.

Ikke medmindre du omorganiserer så de to tabeller bliver til en.

Hvis du alligevel forsøger at slette $Folder.$delFile, så bør du kunne forbedre
performance meget ved at erstatte med ='$delFile' !

Hvis det er noget som upriviligerede brugere kan lave, så skal du huske at beskytte dig mod SQL injection.
Avatar billede sjh Nybegynder
26. november 2007 - 20:39 #2
Ja jeg skulle måske ha smit hele koden, det giver måske mere mening..

Det er fordi jeg har lavet et lille billede upload-script til phpBB og hvis det så ikke står i nogle post så skal filen bare slettes..

  $sqlConn = @mysql_connect($dbhost, $dbuser, $dbpasswd);
  @mysql_select_db($dbname, $sqlConn);

  $folder = "$_SERVER[DOCUMENT_ROOT]/images/users";

  $hDir = dir($folder);
  while (false !== ($delFile = $hDir->read()))
  {
    if($delFile != "." && $delFile != ".."  && $delFile != "index.htm" &! is_dir("$folder/$delFile"))
    {
      if (filemtime("$folder/$delFile")+86400 < time()) /* 86400 = 24 timer. */
      {
        $strSQL = "(SELECT post_id AS id FROM phpbb_posts_text WHERE post_text LIKE '%$delFile%' LIMIT 1) UNION
        (SELECT privmsgs_text_id AS id FROM phpbb_privmsgs_text WHERE privmsgs_text LIKE '%$delFile%' LIMIT 1);";
       
        $sqlResult = @mysql_query($strSQL, $sqlConn);
        if ($sqlResult && mysql_num_rows($sqlResult) == 0)
        {
          @unlink("$folder/$delFile");
        }
      }
    }
  }
  $hDir->close();

  @mysql_close($sqlConn);

Jeg ved godt at der findes et Attachment Mod til phpBB men det kan ikke det jeg skal bruge..

Smider du også lige et svar..
Avatar billede arne_v Ekspert
27. november 2007 - 02:15 #3
Var det ikke bedre at læse op i et array med en enkelt select og så søge i det array
fremfor at querye databasen for hver fil ?

Din LIKE vil godt kunne få falske matches. Du vil ikke slette A.TXT hvis ABBA.TXT er
i databasen.

Jeg ville forsøge at omskrive fra LIKE til = for at få en mere robust kode.

Og et svar.
Avatar billede sjh Nybegynder
27. november 2007 - 05:41 #4
Ja nu du skriver det så kan jeg godt se at det kan gå galt med falske matches.
Så kan jeg kun se at jeg kan klare det ved at have skråstreg forand filnavnet ("/file.jpg")

ellers kan jeg ikke se hvordan jeg skulle tjekke det..
http://server/folder/file.jpg
Avatar billede arne_v Ekspert
27. november 2007 - 15:31 #5
/ er ok hvis der ikke er mulighed for subdirs
Avatar billede sjh Nybegynder
27. november 2007 - 15:43 #6
Ja ik.. men så ser det ud til at min sql-string ikke kan laves bedre ?
Avatar billede arne_v Ekspert
27. november 2007 - 16:04 #7
Jeg ville stadig forsoege at "beregne" den fulde sti og saa bruge = fremfor LIKE og putte
et index paa de felter.
Avatar billede sjh Nybegynder
27. november 2007 - 23:58 #8
tak for hjælpen ;)
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
Computerworld tilbyder specialiserede kurser i database-management

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



IT-JOB