Avatar billede lakana Nybegynder
03. december 2007 - 19:49 Der er 8 kommentarer og
1 løsning

Forbedring af funktion til opdatering af række

Jeg har lavet denne funktion, der opdaterer en række i en mysql-database. Nu vil jeg blot høre om nogle har nogle råd til forbedring?

<?php
function update( $id, $data = array() )
{
    if( is_array( $data ) && count( $data ) >= 1 )
    {
        foreach( $data as $field => $value )
        {
            $data[$field] = "`{$field}` = '{$value}'";
        }
        $data = implode( ", ", $data );
       
        $query = mysql_query(
            "UPDATE
                `table`
            SET
                {$data}
            WHERE
                `id` = '{$id}'
            LIMIT
                1"
        );
        return mysql_affected_rows() == 1;
    }
    else
    {
        return false;
    }
}
?>
Avatar billede nielle Nybegynder
03. december 2007 - 21:09 #1
Koden er fin og kan næppe forbedres væsentlig.

Dog må jeg sige at det er lidt synd at du så fastlægger dig på at alle dine datafelter skal være af en teksttype. På den måde afskære du dig for de fordele der er ved f.eks. at vælge talfelter eller datetime felter for bestemte typer af data.
Avatar billede erikjacobsen Ekspert
03. december 2007 - 21:47 #2
Der er ikke noget der forhindrer felterne i at være taltyper i den kode der vises (så længe vi snakker mysql)
Avatar billede erikjacobsen Ekspert
03. december 2007 - 21:53 #3
Men vi havner derimod i den kedelige/spændende diskussion om sql-injection. De værdier du putter ind kan indeholde tegnet: '  - og med mindre de er puttet igennem addslashes af dig eller af PHP selv, så får du i bedste fald en sql-fejl, i værste fald manipuleret dine data. (Og hvis der er fejl, får du det slet ikke at vide).

Den gode løsning er ikke din kode, men brug af funktionerne i http://php.net/mysqli - herunder "prepared statements" http://dk.php.net/manual/en/function.mysqli-prepare.php (eller noget tilsvarende)
Avatar billede showsource Seniormester
04. december 2007 - 05:55 #4
Og brugen af en bestemt tabel, er vel ikke så optimalt.

Og at sætte $data lig med array, samt din return, ville jeg nok ændre

function update($tabel="tabel", $id, $data )

og
if( true == (int)count( $data ) )

og
UPDATE `". $tabel ."` ( eller `{$tabel]` )

og
return mysql_affected_rows();
Avatar billede showsource Seniormester
04. december 2007 - 05:56 #5
hov, slåfejl ved tabel! ( sovetid )
Avatar billede showsource Seniormester
04. december 2007 - 05:59 #6
Og
function update( $id,$data,$tabel="tabel" )
Avatar billede nielle Nybegynder
10. december 2007 - 18:37 #7
Hvad med noget respons?
Avatar billede showsource Seniormester
11. december 2007 - 01:26 #8
ehe, og jeg kan godt "counte" på en var, ( mente ikke kunne gøres ), så den med $data=array() ville så være fin! :O)

( nielle, det var lidt respons :O] )
Avatar billede lakana Nybegynder
07. august 2011 - 20:43 #9
svar
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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