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

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

trupix 12-01-12 06:57

עזרה עם לולאה
 
הי,

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

להלן הקוד שלי בנתיים, עזרה תועיל :-)

PHP קוד:

// אלגוריתם לקוד ראנדומלי, בתוך פונקציה 

function createRandomPassword() {
    
$chars "abcdefghijkmnopqrstuvwxyz023456789";
    
srand((double)microtime()*1000000);
    
$i 0;
    
$pass '' ;
    while (
$i <= 7) {
        
$num rand() % 33;
        
$tmp substr($chars$num1);
        
$pass $pass $tmp;
        
$i++;
    }
    return 
$pass;
}

$code createRandomPassword(); // קבלת הערך שמחזירה הפונקציה

//אחרי יצירת הקוד, בדוק אם הוא קיים במסד

include("sql.php");
$check mysql_num_rows mysql_query("SELECT *FROM db WHERE code = '$code'"); 

מכאן אני משער שצריך להוסיף:

PHP קוד:


if ($check == 1/* יש כזה כבר */
{
        
$fnamebydate createRandomPassword();


אגב, אני די משוכנע שהחלק בקוד אשר נוגע לmysql לא כל כך מאובטח, כיצד לדעתכם ניתן לשפר אותו?


Thanks in Advance לעוזרים ..

shushu 12-01-12 07:21

PHP קוד:

// אלגוריתם לקוד ראנדומלי, בתוך פונקציה 

function createRandomPassword() {
    
$chars "abcdefghijkmnopqrstuvwxyz023456789";
    
srand((double)microtime()*1000000);
    
$i 0;
    
$pass '' ;
    while (
$i <= 7) {
        
$num rand() % 33;
        
$tmp substr($chars$num1);
        
$pass $pass $tmp;
        
$i++;
    }
    return 
$pass;
}



//אחרי יצירת הקוד, בדוק אם הוא קיים במסד

include("sql.php");

$passExists true// מאתחל משתנה שאומר לנו שכל עוד לא מצאנו סיסמא מתאימה מבחינתנו היא קיימת ונמשיך לבדוק
while(  $passExists ) {
    
$code createRandomPassword(); // קבלת הערך שמחזירה הפונקציה
    // שאילתה שבודקת אם קיים במסד נתונים -שים לב ששיניתי את החלק של num_rows
    
$check mysql_num_rows (mysql_query("SELECT *FROM db WHERE code = '$code'") );
    if( !
$check ) { // אם לא מצאנו במסד נתונים, אין כזאת סיסמא ואנחנו משנים את המשתנה ל-FALSE וכך יוצאים מהלולאה
        
$passExists false;
    }



אדיר 12-01-12 07:55

מה שאתה מתאר כאן מתאים בדיוק למטרה של do..while.

בנוגע לאבטחה של השאילתה אין כאן שום בעיה, לא ניתן לבצע עליה מניפולציות כאלו ואחרות,
מה שכן הייתי ממליץ לך לעשות זה לשנות את השאילתה ולשלוף את כמות השורות עם COUNT(id) + fetch_row ולא כמו שאתה עושה,
זה יהיה יותר יעיל ואמין מאשר מה שעשית + מה שתיקנו אותך.

בנוגע לפונקציה עצמה,
למה אתה מממש את ה- while ככה? בשביל זה יש את for.
כנל לגבי החיבור של הערך בכל ריצה, בשביל זה יש את האופרטור "=.".

trupix 12-01-12 08:04

הי בוקר טוב!! :)

shushu רב תודות!

xPerfection מה הכוונה לשלוף את כמות השורות?
כלומר ככה?:

PHP קוד:

$check mysql_num_rows (mysql_query("SELECT COUNT(field) FROM db WHERE code = '$code'") ); 

נ.ב, התוצאה של שימוש בwhile יכולה להאט? או שיש לה חסרון אחר?

אדיר 12-01-12 08:09

אתה לא מריץ mysql_num_rows כשאתה שולף ככה (אפשרי אבל מיותר),
הפונקציה הזאת מחזירה לך את כמות השורות שחזרו אז אתה לוקח ממנה את המידע באמצעות fetch_row\fetch_assoc.

כמו כן הייתי ממליץ להוסיף אינדקס מסוג UNIQUE לשדה הזה,
יתן שיפור הן ברמת האבטחה ויבטיח ייחודיות של הערך והן ברמת היעילות ויעזור לקצר את זמן הריצה של השאילתה בתיאוריה.


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

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