הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   בעיה עם מחלקות בPHP (https://hosts.co.il/forums/showthread.php?t=51869)

DCB 12-08-07 10:41

בעיה עם מחלקות בPHP
 
או קי בניתי את המחלקה הפשוטה הזאת לטיפול במסדי נתונים לפני 10 דקות הכל עבד מעולה פתאום זה לא :S
מה הבעיה??
יש לי 3 קבצים אחד מכיל את המחלקה, database.php
PHP קוד:

class database {
    function 
query($mysql){
        global 
$db_host;
        global 
$db_user;
        global 
$db_pass;
        global 
$db_db;
        
$con = @mysql_connect($db_host$db_user$db_pass) or die(_DB_ERROR01);
        @
mysql_select_db($db_db) or die(_DB_ERROR02);
        return @
mysql_query($mysql$con) or die(_DB_ERROR03);
    }
    function 
fetch_array($mysql){
        return 
mysql_fetch_array(database::query($mysql)) or die (_DB_ERROR03);
    }


קובץ שני הוא הראשי והוא קורא למחלקה ומריץ את השאילתה, index.php
PHP קוד:

include ("config.php");
include (
"classes/database.php");

$sql database::fetch_array("SELECT * FROM test WHERE id = 1");
print_r($sql); 

ויש את קובץ ההגדרות שמכיל את הנתונים להתחברות למסד, config.php
PHP קוד:

$db_host "localhost";
$db_user "*****";
$db_pass "*****";
$db_db "*****"

מישהוא רואה כאן את הבעיה? :\

בניה 12-08-07 11:01

תוריד את ה@ אתה לא צריך אותם.
ומה הכוונה לא עובד?
וגם עדיף להשתמש ב mysql_fetch_assoc ולא array

Elad-A 12-08-07 13:57

קודם כל למה אתה משתמש ב ee::ee זה כבר ישן משתמשים ב new כדי לאתחל..

והנה מחלקה לדוגמא שתראה איך זה עובד:

PHP קוד:

<?php

$db 
= new database;

class 
database 
{
    function 
Query($mysql)
    {
                global 
$db_host $db_user $db_pass $db_db;

        
$con mysql_connect($db_host$db_user$db_pass) or die(_DB_ERROR01);
                
mysql_select_db($db_db) or die(_DB_ERROR02);

                return 
mysql_query($mysql$con) or die(_DB_ERROR03);
        }
    
    function 
FetchArray($query)
    {
                return 
mysql_fetch_array($query) or die (_DB_ERROR03);
        }
}  


$query $db->Query("SELECT * .....");
while(
$c $db->FetchArray($query))
{
    ......
}

?>

זה העיקרון תפתח את זה לאיפה שתצטרך..

DCB 12-08-07 16:48

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

אלעד השיטה שלך היא בערך השיטה המקורית שלי פשוט חשבתי לחסוך קוד ולהפוך אותו ליותר אסטתי על ידי הכנסה של פונקצית השאילתה ישר לתוך הפונקציה של הfetch array

ואלעד גם עם כל מה שאמרת:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /****/***/**********/***/classes/database.php on line 18

שורה 18
PHP קוד:

return mysql_fetch_array($mysql) or die (_DB_ERROR03); 


Elad-A 12-08-07 16:57

תציג את כל הקוד שלך, זה יעזור יותר.
ומה שהבאתי לך זה בסך הכל דוגמא שתראה איך זה בנוי..

וד"א בפונקציה FetchRow שכחתי לשים global להתחברות בגלל זה השגיאה.

DCB 12-08-07 16:59

זה כל הקוד מה שהראתי לכם.
(זאת שורה 18 כי יש למעלה הסברים על הקובץ ואיך להשתמש בו אל תתייחס)

Elad-A 12-08-07 17:02

אממ קח מחלקה שפעם השתמשתי בה:

PHP קוד:

<?php

$db 
= new mysql;

class 
mysql 

    function 
Connect($host$name$pass$db)
    { 
        
$connection mysql_connect($host$name$pass); 
          
mysql_select_db($db$connection); 
    }
 
    function 
FetchRow($query)
    { 
        
$rows mysql_fetch_row($query); 
        return 
$rows
    } 
    function 
FetchArray($query)
    { 
        
$array mysql_fetch_array($query); 
        return 
$array
      } 

    function 
FetchNum($query)
    { 
        
$num mysql_num_rows($query); 
        return 
$num
    } 
  
    function 
Query($sql)
      { 
          
$query mysql_query($sql) or die(mysql_error()); 
          return 
$query
    }
}

?>

בקובץ global.php שלך תשים ככה:

PHP קוד:


// the user name of the mysql data base
$DataBase['user'] = "root";

// the password of the mysql data base
$DataBase['pass'] = "";

// the name of the mysql data base
$DataBase['name'] = "xyz";

// the host of the mysql data base, default: "localhost"
$DataBase['host'] = "localhost";

$DB->Connect($DataBase['host'], $DataBase['user'], $DataBase['pass'], $DataBase['name']); 

ככה זה יחסוך לך התחברות למסד כל פעם, אני מאמין שמפה אתה תסתדר כבר..

DCB 12-08-07 17:05

תודה אלעד אבל בכל זאת מישהוא רואה את הבעיה?
אני מנסה להבין מה הולך פה :\

Elad-A 12-08-07 17:06

אני חושב שבגלל שלא שמת global בפונקציה וגם לא התחברת למסד בכלל..

תנסה ככה:

PHP קוד:

    function fetch_array($mysql){
        global 
$db_host $db_user $db_pass $db_db;
        
$con = @mysql_connect($db_host$db_user$db_pass) or die(_DB_ERROR01);
        @
mysql_select_db($db_db) or die(_DB_ERROR02);
        return 
mysql_fetch_array(database::query($mysql)) or die (_DB_ERROR03);
    } 


DCB 12-08-07 17:17

אלעד תודה על הנסיון אבל אתה זורק ניחושים לאוויר ועדיין אותה שגיאה חוזרת...
תסתכל שוב על הפונקציות והמחלקה שלי..
הגדרתי אותם כglobal אני ניגש למחלקה בצורה נכונה הכל לפי הספר...

Elad-A 12-08-07 17:19

ניסית להשתמש במחלקה שהבאתי לך?

DCB 12-08-07 17:20

לא... אני רוצה לפתור את הבעיה במחלקה שלי ולהבין מה קורה שם...
אם זה היה עניין של פשוט לרוץ לעבודה כבר הייתי מעתיק מחלקה מאיזה מערכת קוד פתוח או משהוא

Elad-A 12-08-07 17:23

בסדר, תשמע קודם אתה צריך ליצור פונקציה התחברות למסד, זה הרבה יותר יעיל ממה שעשית ככה גם לא תצטרך לעשות global בפונקציות.
ואמרתי לך כבר יותר עדיף להשתמש ב $db->c מאשר db::c אבל איך שתבחר.

DCB 12-08-07 17:24

השתמשתי בפנייה למחלקה על ידי new ו$db->$c
וגם יצרתי התחברות מראש למסד
אבל עדיין...

חיים 12-08-07 17:29

דבר ראשון אתה מתחבר מחדש בכל שאילתא שלך דבר השני השגיעה מראה לך שהמידע שהכנסת בפעולת הכיווץ הוא לא שאילתה ז"א המידע לא עבר דרך הפונקצייה mysql_query תראה תקוד המלא שלך שיש לך כרגע כולל השאילתה ששאלת וכ"ו
עריכה:דניאל יש לך מסנגר?אם כן אז תוסיף אותי

Eran-s 12-08-07 17:29

מה השגיאה?

DCB 12-08-07 17:44

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

בניה 12-08-07 21:14

בקשר להצגת שגיאות.
כשאתה מפתח את האתר, תוסיף את הפונקציה הזו בתחילת הקוד:
קוד:

error_reporting(E_ALL);
ואל תוסיף @ וככה אתה תראה כל שגיאת PHP הכי קטנה.
וכשהאתר מגיע להרצה תשנה את הE_ALL ל0 ואז לא תופיע שום שגיאה, אפילו לא parse error
ככה נהוג לעבוד.

DCB 12-08-07 21:39

תודה על הטיפ בניה
אני יתחיל להשתמש בזה

בניה 12-08-07 21:44

אם אתה מתחיל לקבל מלא E_NOTICE לא צריך להבהל, אלו שגיאות שהPHP עובד למרות שיש אותן, אבל יותר נכון לעבוד בצורה שהן לא מופיעות.

DCB 12-08-07 21:53

כה שמתי לב לזה בדיוק קיבלתי שגיאה כי לא שלחתי משתנה לפונקציה
(משתנה בולני שאם אני לא שולח אותו זה false במילא)

בניה 12-08-07 22:06

ציטוט:

נכתב במקור על ידי DCB (פרסם 540619)
כה שמתי לב לזה בדיוק קיבלתי שגיאה כי לא שלחתי משתנה לפונקציה
(משתנה בולני שאם אני לא שולח אותו זה false במילא)

במקרה הזה תוסיף לו ערך ברירת מחדל false.
PHP קוד:

function func($arg false) {
return 
"asdfasfdasdf";




כל הזמנים הם GMT +2. הזמן כעת הוא 10:13.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ