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

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



  #2  
ישן 05-01-2007, 13:36
  alon.ada alon.ada אינו מחובר  
 
חבר מתאריך: 26.12.06
הודעות: 110
תכנות מונחה עצמים
בתגובה להודעה מספר 1 שנכתבה על ידי dardevil שמתחילה ב "התחברות חדשה למסד בכל פונקציה"

אני יתן לך פה דוגמא לקובץ שכתבתי שפותר את הבעיה שיש לך. אם אתה לא יודע תכנות מונחה עצמים אז תכתוב פה ואני יסביר לך את הקוד אם אתה לא מבין.
קוד PHP:
<?php
class data_base
{
 private 
$connection;
 private 
$pass;
 private 
$server;
 private 
$user;
 private 
$db;

function 
__construct($server="localhost",$user="root",$pass="",$db="web")
{
$this->server=$server;
$this->user=$user;
$this->pass=$pass;
$this->db=$db;
}
function 
set_pass($pass)
{
$this->pass=$pass;
}
function 
set_server($server)
{
$this->server=$server;
}
function 
set_user($user)
{
$this->user=$user;
}
public function 
connect($encode='utf8')
{
$this->connection=mysql_connect($this->server,$this->user,$this->pass) or die("couldn't connect to server");
mysql_select_db($this->db,$this->connection) or die("couldn't select database");
         
mysql_query("SET NAMES '{$encode}'");
}
function 
close_database()
{
mysql_close($this->connection);
}
function 
login($username,$pass)
{
$query="select id,isadmin,username from users where username='{$username}' and password='{$pass}'";
$result mysql_query($query);
$id mysql_fetch_array($result);
if (
$id['id']>0)
{
return 
$id;
}
return -
1;
}
function 
execute($query)
{
$result mysql_query($query) or die ("Query failed: ".mysql_error());
return 
$result;
}
function 
is_exist($field,$value,$table,$data_type)
{
if (
$data_type="string")
{
$query "select * from {$table} where {$field}='{$value}'";
}
else
{
$query "select * from {$table} where {$field}={$value}";
}
$result mysql_query($query);
if (
mysql_num_rows($result)>0)
{
return 
true;
}
return 
false;
}
function 
add_user($user)
{
if (!(isset(
$user["isadmin"])))
{
$query="insert into users(fname,lname,username,email,password,date) values('{$user["fname"]}','{$user["lname"]}','{$user["username"]}','{$user["email"]}','{$user["password"]}',CURRENT_DATE())";
return 
$this->execute($query);
}
else 
{
$query="insert into users(fname,lname,username,email,password,date,isa  dmin) values('{$user["fname"]}','{$user["lname"]}','{$user["username"]}','{$user["email"]}','{$user["password"]}',CURRENT_DATE(),{$user["isadmin"]})";
return 
$this->execute($query); 
}
}
function 
is_admin($username)
{
$result mysql_query("select id from users where username='{$username}' and isadmin=1");
if (
mysql_num_rows($result)>0)
{
return 
true;
}
return 
false;
}
 
}
?>

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

נערך לאחרונה ע"י alon.ada בתאריך 05-01-2007 בשעה 13:43.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #3  
ישן 05-01-2007, 14:37
  Rs3k Rs3k אינו מחובר  
 
חבר מתאריך: 17.05.04
הודעות: 1,454
שלח הודעה דרך ICQ אל Rs3k
בתגובה להודעה מספר 2 שנכתבה על ידי alon.ada שמתחילה ב "תכנות מונחה עצמים"

  • למה יש כאן פונקציות שנוגעות למשתמשים וכו' ?
    קוד שמתעסק עם מסד הנתונים צריך להיות אך ורק קוד למסד הנתונים ותו לא - ז"א בלי פונקציות של בדיקת משתמשים וכו', לאחר מכן המתכנת יכול לרשום את זה כשאילתה בגוף הקוד.
  • כל הקטע זה לעשות את זה יותר נוח (ויעיל) מהמקורי, ובכך לא לשים יותר מדי פונקציות של סה"כ הגדרת משתנה \ הצבת ארגומנט בפונקציה.
  • אין לך שום מניעה ל SQL INJECTION או XSS - פריץ מאוד.
  • כדאי להשתמש בהזחות - במיוחד בקוד מונחה עצמים.
  • בפונקציה is_exist למה אתה שולף הכל רק בשביל לבדוק אם זה קיים? מה שכדאי זה שתשלוף סה"כ את מספר הרשומות ((*)COUNT). למרות כך אני שוב אומר - כזה דבר המתכנת צריך לעשות בגוף הקוד.
  • איפה המחלקה שמייצאת את כל הנתונים?
  • גם אני בזמנו רשמתי מחלקה כזו - לחץ כאן.
המחלקה שהבאתי מונעת SQL INJECTION ופריצות XSS אך ורק אם אתה שם את המשתנה כארגומנט בפונקציה של השאילתה (את כל הנתונים שבאים מהמשתמש תרשום כארגומנט אחרי השאילתה).
לדוגמא הנה הדרך לכתוב שאילתה שבה המחלקה מבריחה את המשתנה str$ :
קוד PHP:
 $db->query = ("SELECT * FROM `%s`"$str); 

אתה צריך לדעת איך פועל printf בשביל להבריח נתונים - בכל מקרה, מקווה שהבנת, אם לא, אני אסביר לך בדיוק מה צריך לעשות בשביל לשלוף נתונים וכו'.
אם לא הבנת את קוד המחלקה - תציין פה, ואני אסביר כל חלק וחלק.

בהצלחה.
_____________________________________
EVERYTHING SHOULD BE MADE AS SIMPLE AS POSSIBLE, BUT NOT ONE BIT SIMPLER
ALBERT EINSTEIN


נערך לאחרונה ע"י Rs3k בתאריך 05-01-2007 בשעה 14:52.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #9  
ישן 05-01-2007, 15:17
  Rs3k Rs3k אינו מחובר  
 
חבר מתאריך: 17.05.04
הודעות: 1,454
שלח הודעה דרך ICQ אל Rs3k
בתגובה להודעה מספר 8 שנכתבה על ידי alon.ada שמתחילה ב "נגיד יש לך מחלקה גדולה..."

זה לא משנה, המחלקה לא תפעל לפני שאתה יוצר אוביקט שלה - וגם אז - רק הקונסטרקטור (בנאי) שלה יפעל.
כמו שאם תבנה פונקציה בתחילת העמוד היא לא תפעל עד כאשר תקרא לה.
זה בכלל לא משנה אם תצרף את זה לעמוד - אך ורק אם תיצור מופע למחלקה PHP ייתיחס למחלקה - אם לא תיצור מופע (אוביקט) PHP בכלל לא מתייחס למחלקה.
וגם - כאשר יוצר אובייקט \ מופע - סה"כ הפעלת את הקונסטרקטור (בנאי) שלה - בשביל להבין את אופן פעולת המחלקה יש קודם להבין את אופן פעולת הפונקציות.
הרי אל תשכח שמחלקה זה סה"כ אוגד של פונקציות.
_____________________________________
EVERYTHING SHOULD BE MADE AS SIMPLE AS POSSIBLE, BUT NOT ONE BIT SIMPLER
ALBERT EINSTEIN


נערך לאחרונה ע"י Rs3k בתאריך 05-01-2007 בשעה 15:19.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #11  
ישן 07-01-2007, 13:30
  alon.ada alon.ada אינו מחובר  
 
חבר מתאריך: 26.12.06
הודעות: 110
הסבר קצר
בתגובה להודעה מספר 10 שנכתבה על ידי dardevil שמתחילה ב "א. תודה רבה על התגובה המהירה..."

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

class data_base
נותנים את שם המחלקה, מהמחלקה אתה יכול ליצור מופע שהוא בעצם אוביקט.
לכל מחלקה יש מאפיינים ושיטות.
קוד PHP:
 function __construct($server="localhost",$user="root",$pass="",$db="web")
{
$this->server=$server;
$this->user=$user;
$this->pass=$pass;
$this->db=$db;



שיטה זו נקראת בנאי ברגע שיוצרים את האוביקט מהמחלקה השיטה הזאת מופעלת.
תפיק השיטה הוא לאתחל את המשתנים החברים במחלקה.
במקרה הזה אפשר להעביר לשיטה הבונה את השרת שם המשתמש הסיסמא ושם המסד שאיתו עובדים. אם לא מעבירים פרמטרים אז הוא משתמש בברירת המחדל שאתה קובע למשל:
קוד PHP:
 $server="localhost",$user="root",$pass="",$db="web" 


השיטה הבאה שאני יסביר לך היא מה שנקרא get ו set בc# למשל.
אתה אף פעם לא נותן למשתנים החברים במחלקה הגדרה של public. אתה בונה שיטה שבעזרתה
יהיה אפשר לשנות את המשתנה.
דוגמא:
קוד PHP:
 function set_pass($pass)
{
$this->pass=$pass;


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

שאר השיטות שיהיה במחלקה הם כל מיני שיטות לטיפול במסד הנתונים כמו:
קוד PHP:
 public function connect($encode='utf8')
{
$this->connection=mysql_connect($this->server,$this->user,$this->pass) or die("couldn't connect to server");
mysql_select_db($this->db,$this->connection) or die("couldn't select database");
         
mysql_query("SET NAMES '{$encode}'");


שמבצעת חיבור למסד הנתונים. הפרמטר שהיא מקבלת היא הקידוד ברירת המחדל היא utf-8.
מקווה שעזרתי...
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #12  
ישן 07-01-2007, 19:52
  dardevil dardevil אינו מחובר  
 
חבר מתאריך: 12.08.05
הודעות: 883
בתגובה להודעה מספר 11 שנכתבה על ידי alon.ada שמתחילה ב "הסבר קצר"

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

קוד PHP:
<?
$connection = mysql_connect("localhost","root","")
    or die ("Couldn't connect to server");
$db = mysql_select_db("***",$connection)
    or die ("Couldn't select database");
 
    function display_errors()
        {
            global $errors;
 
            foreach ($errors as $err){
            echo $err, "<BR>";
            }
        }
 
    function process_data()
        {
            global $cp_welcome_login, $cp_sorry_login;
            if ($_POST['username'] == "moshe" && $_POST['password'] == 12345) {
                echo $cp_welcome_login;
                $ip_login = $_SERVER['REMOTE_ADDR'];
                 $query = "UPDATE login SET ip = ('$ip_login')";
                 $result = mysql_query($query)
                      or die("Query failed: ".mysql_error());
                echo $ip_login;
                }
            else {
                echo $cp_sorry_login;
                }
        }
 
    function display_welcome()
        {
            global $cp_username, $cp_password, $cp_email, $send;
            echo " <FORM METHOD='POST' ACTION='cp.php'> " .$cp_username. ": <INPUT TYPE=TEXT NAME=username><br>
                " .$cp_password. ": <INPUT TYPE=TEXT NAME=password><br>
                " .$cp_email. ": <INPUT TYPE=TEXT NAME=email><br><br>
                <INPUT TYPE=SUBMIT VALUE=$send>
                <INPUT TYPE=HIDDEN NAME=seen_already VALUE=hidden_data>
                </FORM>
                ";
        }
 
    mysql_close($connection);
?>


אם תנסה את הקוד תבין שהנסיון לשאוב נתונים מהמסד לא פועל.

אך אם תוציא את הקוד שמנסה לשאוב נתונים מהמסד מתוך הפונקציה ותרשום אותו במקום אחר בעמוד שהוא לא בתוך פונקציה הוא יעבוד פיקס.

עוד משהו, אם אני יעתיק את הקוד של ההתחברות לתוך הפונקציה ההוצאת נתונים מהמסד תעבוד.
אני מקווה שהבנת מה הבעיה שלי.
תודה!
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #13  
ישן 07-01-2007, 21:48
  Rs3k Rs3k אינו מחובר  
 
חבר מתאריך: 17.05.04
הודעות: 1,454
שלח הודעה דרך ICQ אל Rs3k
בתגובה להודעה מספר 1 שנכתבה על ידי dardevil שמתחילה ב "התחברות חדשה למסד בכל פונקציה"

קוד PHP:
 function __construct($db$user 'root'$host 'localhost'$pass false$dbType 'mysql'){
if(!
$pass)
$this->key = @mysql_connect($host$user) or $this->error();
else
$this->key = @mysql_connect($host$user$pass) or $this->error();
if(
$this->key){
if (
trim($db))
    @
mysql_select_db($db$this->key) or $this->error();
else{
    
mysql_close($this->key);
    return 
false;
}
return 
$this->key;
}
else
$this->error();


פונקציה די פשוטה, ההתחברות למסד נתונים.
יש שם פרמטר dbType כיוון שבעתיד אני כנראה אוסיף למחלקה הרחבות למסדי נתונים אחרים.
קוד PHP:
 private function escapeArray($array){
if(
get_magic_quotes_gpc()){
for(
$i 0$i count($array); $i++){
    
$array[$i] = htmlspecialchars(mysql_real_escape_string(stripsla  shes($array[$i])), ENT_NOQUOTES);
}
}
else{
for(
$i 0$i <= count($array); $i++){
    
$array[$i] = htmlspecialchars(mysql_real_escape_string($array[$i]), ENT_NOQUOTES);
}
}
return 
$array;


פונקציה שמבריחה כל איבר במערך, כיוון שבפונקציה query (נדון עליה בהמשך), אני משיג את הארגומנטים (המשתנים שיוברחו) בסוג של מערך.
קוד PHP:
 final public function query($query){
$this->numQuery ++;
$args array_slice(func_get_args(), 1);
$this->queryResult mysql_query(vsprintf($query$this->escapeArray($args)), $this->key) or $this->error();
return 
$this->queryResult;


פונקציה לשאילתה, מבריחה את התווים ומוסיפה 1 למספר השאילתות שהיו.
כמו שאפשר לראות, הוספתי את האפשרות להשתמש בprintf - כאשר אתה רוצה להבריח את הנתונים, תשתמש בשאילתה כסוג של printf - כאשר זה לא חשוב תרשום את המשתנה בגוף השאילתה ובכך תחסוך משאבים.
קוד PHP:
 public function fetchResult($stat 'array'$allExtract false$query false){
$this->queryResult = ($query) ? $query $this->queryResult;
switch(
$stat){
case 
'num':
    
$this->queryFetch = @mysql_num_rows($this->queryResult) or $this->error();
    break;
case 
'object':
case 
'array':
case 
'row':
case 
'lengths':
    
$mysqlFetch 'mysql_fetch_'.$stat;
    if(!
$allExtract){
     
$this->queryFetch $mysqlFetch($this->queryResult) or $this->error();
     break;
    }
    while(
$i $mysqlFetch($this->queryResult))
     
$this->queryFetch[] = $i;
    break;
default:
    return 
false;
}
mysql_free_result($this->key);
return 
$this->queryFetch;


הפונקציה לשליפת הנתונים - ישנה אפשרות לשלוף את כל הנתונים בבת אחת, וישנן כמה דרכים לשלוף את הנתונים (object, array וכו').
ישנה גם הפונקציה mysql_free_result בסוף שבעצם מוחקת את הזכרון של השאילתה ובכך מקלה על השרת.
קוד PHP:
 protected function error(){
die(
mysql_error());


פונקציה פשוטה לשגיאות, כך אפשרי לשנות את זה לכך שאם יש שגיאה אז זה לא יציג את העמוד וישלח הודעה למנהל הראשי וכדו'.
קוד PHP:
 function __destruct(){
unset(
$this->key$this->numQuery$this->queryResult$this->queryFetch);


פונקציה שמוחקת את המשתנים, נועדה אך ורק להקל על השרת.

יש להגיד כי המחלקה שונתה במקצת מהקוד הקודם, אז כדאי שתשתמש בזאתי אם אתה בוחר במחלקה הזו.
בכל מקרה - הנה דוגמא לשימוש :
קוד PHP:
 $db = new db('myDB''user''localhost''pass');
$db->query("SELECT `user`, `pass` FROM `userData` WHERE `user` = '%s' AND `pass` = '%s'"$_POST['user'], $_POST['pass']);
if(!
$user $db->fetchResult('object')->user)
die(
'Restricted Area');
echo 
"Welcome ".$user.", How Are You?"

המחלקה הבריחה אוטומטית את המשתנים ['POST['pass_$ ו ['POST['user_$.
ולאחר מכן השתמשתי בפונקציה fetchResult כדי לשלוף את הנתונים כאוביקט ואימתתי בתנאי אם המשתמש רשום \ לא.
_____________________________________
EVERYTHING SHOULD BE MADE AS SIMPLE AS POSSIBLE, BUT NOT ONE BIT SIMPLER
ALBERT EINSTEIN

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

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

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

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

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



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

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

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

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