Avatar billede moddi100 Seniormester
03. juli 2008 - 16:04 Der er 10 kommentarer og
1 løsning

sprintf med et array som argument

Hej

Jeg er i øjeblikket ved at lave en mysql_query funktion. Det den skal gøre, er at den skal escape alle variabler der medsendes som parameter. Variablerne kan nemlig komme direkte fra brugerinput.

Dette er hvad jeg har ind til videre:

function mysql_query2($sql, $fejl)
{
  connect(); // Opret forbindelse
  $args = mysql_real_escape_string(func_get_args()); // Hent alle variablerne der er medgivet som paramatre

  $query = sprintf($sql, $args); // Det er her jeg sidder fast

  $result = mysql_query($query) or die($fejl);
  close(); // Luk forbindelse
}

Som det ser ud lige nu, tager den jo også de to første parametre til funktionen med, når den skal til at samle querien. Det er heller ikke meningen, men det kan jeg selv fikse.
Mit største problem er altså hvordan jeg kan lave den sprintf() funktion så den tager x antal parametre med.

Sql-sætningen kunne se nogenlunde sådan ud:
INSERT INTO table (felt1,felt2) VALUES ('%d','%d')

Mvh
Morten
Avatar billede jakobdo Ekspert
04. juli 2008 - 08:10 #1
Jeg tror jeg ville vælge at escape variabler individuelt.

Tal kan smides direkte videre, hvor du dog bør smide ' og ' omkring strenge.
Avatar billede moddi100 Seniormester
04. juli 2008 - 09:58 #2
Ville du så lave noget i stil med følgende:

for(i = 0; $i < func_num_args; $i++)
{
  $var = func_get_arg($i);
  if(is_numeric($var)
    $args[] = $var;
  else
    $args = "'" . mysql_real_escape_string($var) . "'";
}

??
Avatar billede jakobdo Ekspert
04. juli 2008 - 10:12 #3
Eller:

$var = func_get_arg($i);
if(is_numeric($var){
    $args[] = intval($var);
}else{
    if(get_magic_quotes_gpc()){
        $args = "'" . mysql_real_escape_string(stripslashes($var)) . "'";
    else
        $args = "'" . mysql_real_escape_string($var) . "'";
}
Avatar billede moddi100 Seniormester
04. juli 2008 - 10:18 #4
Du har en pointe dér. :)
Avatar billede moddi100 Seniormester
04. juli 2008 - 11:21 #5
Har du nogen forslag til hvordan sprintf-funktionen kan løses??
Avatar billede jakobdo Ekspert
04. juli 2008 - 11:31 #6
Ikke lige på stående fod eller siddende røv.
Avatar billede moddi100 Seniormester
04. juli 2008 - 12:20 #7
:D Du tror/kender ikke nogen funktion der kan gøre det?

Så kan det jo være man skulle prøve en regex løsning.
Hvis nu sql-stregen ser sådan ud:

INSERT INTO tabel (felt1,felt2,felt3,felt4) VALUES (%s,%s,%s,%s)

Kunne man så ikke lave funktionen alá dette:

for(i = 2; $i < func_num_args; $i++) // De første parametre til denne funktion skal ikke medtages
{
  $patterns[] = "%s";
  $replacements[] = args($i);
}
$query = preg_replace($patterns, $replacements, $sql);

Jeg ved ikke lige hvordan array'et replacements skal sorteres for at det virker.
Avatar billede moddi100 Seniormester
04. juli 2008 - 13:28 #8
Så lykkedes det. Her er den færdige version:

function mysql_query2($sql, $fejl)
{
    $patterns = array();
    $replacements = array();
    $args = array();
   
    connect();
    for($i = 2; $i < func_num_args(); $i++) // Escape alle variabler undtagen tal
    {
        $var = func_get_arg($i);
        if(is_numeric($var))
        {
            $args[] = intval($var);
        } else {
            if(get_magic_quotes_gpc())
                $args[] = "'" . mysql_real_escape_string(stripslashes($var)) . "'";
            else
                $args[] = "'" . mysql_real_escape_string($var) . "'";
        }
    }
   
    for($i = 2; $i < func_num_args(); $i++) // Erstat variablerne
    {
      $sql = preg_replace("/'?%s'?/", $args[$i - 2], $sql, 1);
    }
   
    $result = mysql_query($sql) or die($fejl);
    close();

    return $result;
}

Smider du et svar jakobdo, så får du point.
Avatar billede jakobdo Ekspert
04. juli 2008 - 22:22 #9
Svar!
Avatar billede jakobdo Ekspert
05. juli 2008 - 10:40 #10
Takker for point
Avatar billede moddi100 Seniormester
05. juli 2008 - 10:42 #11
Og jeg takker 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
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