2012-08-02 2 views
0

Maintenant j'ai converti ma requête au format PDO. Mais je dois implémenter la requête avec l'ancien format pour peu de temps la prochaine fois. Le code est comme ceci:Pourquoi mysql real_escape_string vsprintf ne fonctionne pas

function mysql_Select($sql) { 
    $data=array(); 
    $params=func_get_args(); 
    $s=PreparaSQL($sql, $params); 
    $res = mysql_query($s); 
    if ($res && mysql_num_rows($res)){ 
     while($dt = mysql_fetch_object($res)){ 
      $data[]=$dt; 
     } 
     return $data; 
    } 
} 

function PreparaSQL($sql, $array_param){ 
    unset($array_param[0]); 
    foreach ($array_param as $k => $v){ 
     $array_param[$k]=mysql_real_escape_string($v);  } 
    return vsprintf(str_replace("params","%s",$sql), $array_param); 
} 

et exécuter la fonction est:

$data=mysql_Select('SELECT concat(id," | ",wh2) as label,Id as kode,wh2 as nama,wh2 as value FROM wh011 where wh2 like %s',$_GET['where']); 
echo json_encode($data); 
flush(); 

et sortie ont erreur avec une valeur null. Je pense que le problème est dans ce code:

return vsprintf(str_replace("params","%s",$sql), $array_param); 

Je ne sais pas vraiment où est le point d'erreur. Merci pour votre réponse.

+1

Veuillez ne pas utiliser les fonctions 'mysql_ *' pour écrire du nouveau code. Ils ne sont plus entretenus et la communauté a commencé [processus de dépréciation] (http://goo.gl/KJveJ). Voir la [* boîte rouge *] (http://goo.gl/GPmFd)? Au lieu de cela, vous devriez en apprendre davantage sur les [instructions préparées] (http://goo.gl/vn8zQ) et utiliser soit [PDO] (http://php.net/pdo) ou [MySQLi] (http://php.net/ mysqli). Si vous ne pouvez pas décider lequel, [cet article] (http://goo.gl/3gqF9) vous aidera. Si vous choisissez PDO, [voici un bon tutoriel] (http://goo.gl/vFWnC). – orourkek

+1

Je réalise que vous convertissez en PDO, mais je me sens obligé de publier ce commentaire chaque fois que les fonctions 'mysql_ *' sont utilisées^ – orourkek

+0

Puisque vous utilisez des fonctions, vous pouvez refactoriser votre code naturellement à l'intérieur des fonctions. Tant que l'entrée est placée dans le même format et que les résultats sont retournés dans le même format, vous n'avez pas besoin de changer d'autre code. –

Répondre

0

Je pense que les paramètres 1 et 2 sont erronés.

Essayez:

$ sql = "voici mon params string avez-vous trouvé? \ N"; Echo vsprintf (str_replace ("params", "% s", $ sql), "BOO!");

Sortie

here is my string BOO! did you find it? 

Je vous suggère de faire tout simplement pas le str_replace ...?

+0

merci. J'ai changé mon code à votre réponse, comme ceci: return vsprintf (str_replace ("% s", "params", $ sql), $ array_param); mais ont encore un retour nul. –

+0

Ah, je pense que peut-être le problème est dans la "logique" ici. vsprintf doit avoir le% s là-dedans oui? et vous le passez le% s, mais en le remplaçant par le mot "params" avec lequel vsprintf échoue. Regardez ma réponse mise à jour pour voir si cela aide. – FreudianSlip

+0

ouais ... merci beaucoup.essayer avec ce code: echo vsprintf (str_replace ("params", "% s", 'SELECT concat (id, "|", wh2) comme label, Id comme kode, wh2 comme nama, wh2 comme valeur FROM wh011 où wh2 like % s '),' "% aaa" '); et la chaîne de requête était correcte: SELECT concat (id, "|", wh2) en tant que label, Id en tant que kode, wh2 en tant que nama, wh2 en tant que valeur FROM wh011 où wh2 aime "% aaa". –

0

Vous ne pouvez pas utiliser mysql_real_escape_string() tant qu'une connexion n'a pas été établie. Vous devrez peut-être écrire votre propre méthode d'échappement. Voir la section des notes here pour plus de détails.

+0

je pense que mysql_real_escape_string a été dans ma connexion. parce que si j'exécute avec ce code, la connexion est exécutée avant la fonction mysql_Select et la fonction renvoie la valeur. this est le code: $ data = mysql_Select ('SELECT concat (id, "|", wh2) comme label, Id comme kode, wh2 comme nama, wh2 comme valeur FROM wh011 '); et ceci est le résultat: [{"label": "1 | Celullar", "kode": "1", "nama": "Celullar", "valeur": "Celullar"}] –

Questions connexes