לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 14-10-2006, 17:12
  Rs3k Rs3k אינו מחובר  
 
חבר מתאריך: 17.05.04
הודעות: 1,454
שלח הודעה דרך ICQ אל Rs3k
בעיה עם eval

כן, אני יודע, אני מדביק הרבה אשכולות בזמן האחרון

בכל מקרה, עשיתי מחלקה להתחברות mysql ניסיתי לעשות שהשאילתה תשמש כסוג של sprintf בשביל לעשות mysql_real_escape_string על המשתנים
וגם בגלל שיותר נוח עם sprintf יש לי שני נסיונות שאף אחד מהם לא עובד (הבעיה נמצאת בפונקציה query) :

קוד PHP:
<?
class mysql{
    public $queryResult, $numQuery;
    protected $query, $db;
    private $key, $user, $pass;
    function __construct($db, $user = 'root', $host = 'localhost', $pass = false){
        $this->user = $user;
        $this->pass = $pass;
        if(!$pass)
            $this->key = @mysql_connect($host, $this->user);
        else
            $this->key = @mysql_connect($host, $this->user, $this->pass);
        if($this->key){
            if (trim($db))
                $this->db = @mysql_select_db($db, $this->key);
            else{
                mysql_close($this->key);
                return false;
            }
            return $this->key;
        }
        else
            $this->error();
    }
    public function query($query){
        function escapeArray($array){
            if(get_magic_quotes_gpc()){
                foreach($array as $i)
                    $i = mysql_real_escape_string(stripslashes($i));
            }
            else
                foreach($array as $i)
                    $i = mysql_real_escape_string($i);
            return $array;
        }
        $args = escapeArray(array_slice(func_get_args(), 1));
        unset($this->query);
        if(trim($query) != ''){
            $this->numQuery ++;
            $query = sprintf($query, eval("implode(',', $args)"));
               $this->query = mysql_query($query, $this->key) or $this->error;
        }
        else
            return false;
        return $this->query;
    }
    public function fetchResult($stat = 'array'){
        switch($stat){
            case 'num':
                $this->queryResult = @mysql_num_rows($this->key) or $this->error();
                break;
            default:
                $this->queryResult = eval('@mysql_fetch_'.$stat.'($this->key) or $this->error();');
                break;
        }
        return $this->queryResult;
    }
    protected function error(){
        die(mysql_error());
    }
    function __destruct(){
        unset($this->key);
        unset($this->user);
        unset($this->pass);
    }
}
$sql = new mysql('demlin');
$table = "userdata";
$id = 1;
$sql->query("SELECT * FROM `%d` WHERE ID='%s'", $table, $id);
while($row = $sql -> fetchResult()){
    var_dump($row);
}
?>


כאן זה מחזיר את השגיאות :
Parse error: parse error, unexpected ')', expecting '(' in C:\wamp\www\sql\sqlClass.php(40) : eval()'d code on line 1

Warning: sprintf() [function.sprintf]: Too few arguments in C:\wamp\www\sql\sqlClass.php on line 40

בקיצור, ה sprintf לא רואה את זה בתור שלושה ארגומנטים ('שאילתה', 'טבלה', 'ID') אלא רק בתור שניים ('שאילתה','טבלהID')..
כיוון שאני מעדיף את הקוד הזה מהקוד השני האם למישהו יש פתרון איך אני אגרום לsprintf לראות את זה כ שאילתה טבלה ו ID?

הקוד השני :
קוד PHP:
<?
class mysql{
    public $queryResult, $numQuery;
    protected $query, $db;
    private $key, $user, $pass;
    function __construct($db, $user = 'root', $host = 'localhost', $pass = false){
        $this->user = $user;
        $this->pass = $pass;
        if(!$pass)
            $this->key = @mysql_connect($host, $this->user);
        else
            $this->key = @mysql_connect($host, $this->user, $this->pass);
        if($this->key){
            if (trim($db))
                $this->db = @mysql_select_db($db, $this->key);
            else{
                mysql_close($this->key);
                return false;
            }
            return $this->key;
        }
        else
            $this->error();
    }
    public function query($query){
        function escapeArray($array){
            if(get_magic_quotes_gpc()){
                foreach($array as $i)
                    $i = mysql_real_escape_string(stripslashes($i));
            }
            else
                foreach($array as $i)
                    $i = mysql_real_escape_string($i);
            return $array;
        }
        $args = escapeArray(array_slice(func_get_args(), 1));
        unset($this->query);
        if(trim($query) != ''){
            $this->numQuery ++;
            $query = "sprintf(".$query."";
            for($i = 0; $i <= func_num_args() - 2; $i++)
                $query = $query.",".$args[$i];
            $query = $query.");";
            eval("\$query = \"".$query."\";");
            $this->query = mysql_query($query, $this->key) or $this->error;
        }
        else
            return false;
        return $this->query;
    }
    public function fetchResult($stat = 'array'){
        switch($stat){
            case 'num':
                $this->queryResult = @mysql_num_rows($this->key) or $this->error();
                break;
            default:
                $this->queryResult = eval('@mysql_fetch_'.$stat.'($this->key) or $this->error();');
                break;
        }
        return $this->queryResult;
    }
    protected function error(){
        die(mysql_error());
    }
    function __destruct(){
        unset($this->key);
        unset($this->user);
        unset($this->pass);
    }
}
$sql = new mysql('demlin');
$table = "userdata";
$id = 1;
$sql->query("SELECT * FROM `%d` WHERE ID='%s'", $table, $id);
while($row = $sql -> fetchResult()){
    var_dump($row);
}
?>

מוציא את השגיאה:
Parse error: parse error, unexpected '`' in C:\wamp\www\sql\aa.php(35) : eval()'d code on line 1

ובכן הקוד הזה הרבה פחות יעיל ונחמד, אבל הוא עושה את העבודה יותר טובה..
בסוף יוצא ש:
קוד PHP:
 $query "sprintf("SELECT FROM `%dWHERE ID='%s'  ,'userdata','1'") 

אבל ה eval לא הופך את ה sprintf לקוד PHP - גם פה אני לא מבין למה, זה ממש דומה להסבר בPHP.net..


את הקוד השני אני פחות מעדיף, אבל אשמח לפתרון גם בשבילו

תודה מראש.
_____________________________________
EVERYTHING SHOULD BE MADE AS SIMPLE AS POSSIBLE, BUT NOT ONE BIT SIMPLER
ALBERT EINSTEIN


נערך לאחרונה ע"י Rs3k בתאריך 14-10-2006 בשעה 17:26.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #2  
ישן 14-10-2006, 20:01
  Rs3k Rs3k אינו מחובר  
 
חבר מתאריך: 17.05.04
הודעות: 1,454
שלח הודעה דרך ICQ אל Rs3k
בתגובה להודעה מספר 1 שנכתבה על ידי Rs3k שמתחילה ב "בעיה עם eval"

תודה בכל מקרה, הצלחתי לפתור את הבעיה
מי שרוצה :

קוד PHP:
 class mysql{
    public 
$queryResult$numQuery;
    protected 
$query$db;
    private 
$key$user$pass;
    function 
__construct($db$user 'root'$host 'localhost'$pass false){
        
$this->user $user;
        
$this->pass $pass;
        if(!
$pass)
            
$this->key = @mysql_connect($host$this->user);
        else
            
$this->key = @mysql_connect($host$this->user$this->pass);
        if(
$this->key){
            if (
trim($db))
                
$this->db = @mysql_select_db($db$this->key);
            else{
                
mysql_close($this->key);
                return 
false;
            }
            return 
$this->key;
        }
        else
            
$this->error();
    }
    public function 
query($query){
        function 
escapeArray($array){
            if(
get_magic_quotes_gpc()){
                foreach(
$array as $i)
                    
$i mysql_real_escape_string(stripslashes($i));
            }
            else
                foreach(
$array as $i)
                    
$i mysql_real_escape_string($i);
            return 
$array;
        }
        
$args escapeArray(array_slice(func_get_args(), 1));
        unset(
$this->query);
        if(
trim($query) != ''){
            
$this->numQuery ++;
            eval(
"\$query = sprintf(\"\$query\", ".implode(','$args).");");
            
$this->query mysql_query($query$this->key) or $this->error;
        }
        else
            return 
false;
        return 
$this->query;
    }
    public function 
fetchResult($stat 'array'){
        switch(
$stat){
            case 
'num':
                
$this->queryResult = @mysql_num_rows($this->key) or $this->error();
                break;
            default:
                
$this->queryResult = eval('@mysql_fetch_'.$stat.'($this->key) or $this->error();');
                break;
        }
        return 
$this->queryResult;
    }
    protected function 
error(){
        die(
mysql_error());
    }
    function 
__destruct(){
        unset(
$this->key);
        unset(
$this->user);
        unset(
$this->pass);
    }



עריכה: רק עכשיו שמתי לב שזה כנראה לא מבריח
שמחתי יותר מדי מהר
_____________________________________
EVERYTHING SHOULD BE MADE AS SIMPLE AS POSSIBLE, BUT NOT ONE BIT SIMPLER
ALBERT EINSTEIN


נערך לאחרונה ע"י Rs3k בתאריך 14-10-2006 בשעה 20:10.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #3  
ישן 15-10-2006, 17:32
  Rs3k Rs3k אינו מחובר  
 
חבר מתאריך: 17.05.04
הודעות: 1,454
שלח הודעה דרך ICQ אל Rs3k
בתגובה להודעה מספר 2 שנכתבה על ידי Rs3k שמתחילה ב "תודה בכל מקרה, הצלחתי לפתור..."

חברה, מצטער על הטריפל פוסט ..

בכל מקרה, הנה המחלקה :
קוד PHP:
<?
class mysql{
    public $queryFetch, $numQuery;
    protected $queryResult, $db;
    private $key, $user, $pass;
    function __construct($db, $user = 'root', $host = 'localhost', $pass = false){
        $this->user = $user;
        $this->pass = $pass;
        if(!$pass)
            $this->key = @mysql_connect($host, $this->user);
        else
            $this->key = @mysql_connect($host, $this->user, $this->pass);
        if($this->key){
            if (trim($db))
                $this->db = @mysql_select_db($db, $this->key);
            else{
                mysql_close($this->key);
                return false;
            }
            return $this->key;
        }
        else
            $this->error();
    }
    public function query($query){
        function escapeArray($array){
            if(get_magic_quotes_gpc()){
                for($i = 0; $i < count($array); $i++){
                    $array[$i] = mysql_real_escape_string(stripslashes($array[$i]));
                }
            }
            else{
                for($i = 0; $i <= count($array); $i++){
                    $array[$i] = mysql_real_escape_string($array[$i]);
                }
            }
            return $array;
        }
        unset($this->queryResult);
        if(trim($query) != ''){
            $this->numQuery ++;
            $argsNum = array_slice(func_get_args(), 1);
            $query = vsprintf($query, escapeArray($argsNum));
            $this->queryResult = mysql_query($query, $this->key) or $this->error;
        }
        else
            return false;
    }
    public function fetchResult($stat = 'array'){
        switch($stat){
            case 'num':
                $this->queryFetch = @mysql_num_rows($this->queryResult) or $this->error();
                break;
            case 'object':
            case 'array':
            case 'row':
            case 'lengths':
                eval("\$this->queryFetch = @mysql_fetch_".$stat."(\$this->queryResult) or \$this->error();");
                break;
            default:
                return false;
        }
        return $this->queryFetch;
    }
    protected function error(){
        die(mysql_error());
    }
    function __destruct(){
        unset($this->key);
        unset($this->user);
        unset($this->pass);
    }
}
$sql = new mysql('demlin');
$sql -> query("SELECT * FROM `%s`", 'userdata');
$row = $sql -> fetchResult('array'); // can be also object, row, lengths and num (=num_rows)
echo $row[0];
?>


מחלקה די בסיסית (אפשר להוסיף פונקציות לאחר מכן - כמובן), בכל מקרה, אפשר להשתמש בשאילתה בתור sprintf (ובכך המחלקה תבריח את המשתנים לבד) ובתור שאילתה רגילה (המחקלה לא מבריחה ויש להבריח את המשתנים לפני כן).
את הנתונים (מהמסד נתונים) אפשר לשלוף בתור מערך, אובייקט ושורה.
מספר השורות וגודל הנתונים (=mysql_fetch_lengths)..

לגבי הבעיה בתגובה למעלה, אכן פתרתי את זה עם eval אבל בסוף גיליתי שאפשר לעשות את זה עם פונקציה כבר שקיימת vsprintf - ובכך לדעתי החלק הזה הרבה יותר יעיל.
אבל למטה עדיין יש eval - אבל זה מול 5 cases ב switch - אז נראה לי ש eval יוצא יותר יעיל.

5 השורות האחרונות הם לא חלק מהמחלקה - סתם להדגמה (אם זה לא ברור ).
תהנו
_____________________________________
EVERYTHING SHOULD BE MADE AS SIMPLE AS POSSIBLE, BUT NOT ONE BIT SIMPLER
ALBERT EINSTEIN

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 16:11

הדף נוצר ב 0.07 שניות עם 11 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2026 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר