2010-05-30 77 views
0
function addAds($n) { 
for ($i=0;$i<=$n;$i++) { 
    while($row=mysql_fetch_array(mysql_query("SELECT * FROM users"))) { 
    $aut[]=$row['name']; 
    } 
    $author=$aut[rand(0,mysql_num_rows(mysql_query("SELECT * FROM users")))]; 
    $name="pavadinimas".rand(0,3600); 
    $rnd=rand(0,1); 
    if($rnd==0) { 
    $type="siulo"; 
    } else { 
    $type="iesko"; 
    } 
    $text="tekstas".md5("tekstas".rand(0,8000)); 
    $time=time()-rand(3600,86400); 
    $catid=rand(1,9); 
    switch ($catid) { 
    case 1: 
    $subid=rand(1,8); 
    break; 
    case 2: 
    $subid=rand(9,16); 
    break; 
    case 3: 
    $subid=rand(17,24); 
    break; 
    case 4: 
    $subid=rand(25,32); 
    break; 
    case 5: 
    $subid=rand(33,41); 
    break; 
    case 6: 
    $subid=rand(42,49); 
    break; 
    case 7: 
    $subid=rand(50,56); 
    break; 
    case 8: 
    $subid=rand(57,64); 
    break; 
    case 9: 
    $subid=rand(65,70); 
    break; 
    } 
    mysql_query("INSERT INTO advert(author,name,type,text,time,catid,subid) VALUES('$author','$name','$type','$text','$time','$catid','$subid')") or die(mysql_error()); 
} 
echo "$n adverts successfully added."; 
} 

這個函數的問題是它永遠不會加載。正如我注意到的,我的while循環導致它。如果我評論它,一切都好。它必須從我的數據庫中獲得隨機用戶,並將其設置爲變量$ author。無限循環問題

+7

**您有一個SQL注入漏洞**。 – SLaks 2010-05-30 22:18:06

+2

@缺點,不,他們不。所有值都從數據庫中提取或在函數中生成。唯一看起來像是任何問題都可能是用戶表,但這仍然是一個延伸。 – 2010-05-30 22:24:46

+2

@Brendan Long - 僅僅因爲價值來自數據庫並不意味着它很乾淨。在這個問題的範圍內,什麼是阻止'users'中的一行有'','','','','','',''的名稱);插入表sql_injection_attacks值(TIME());'? – 2010-05-30 22:31:05

回答

6

問題是,查詢是在循環中,所以它每次都運行(所以你每次從頭開始)。 while循環之前就在的mysql_query()部分移動到右並將其存儲在一個變量:

$query = mysql_query("SELECT * FROM users"); 
while($row=mysql_fetch_array($query)) 
0

你開始每次運行循環時間的新查詢。

2

在每次迭代中執行並評估while循環的條件。所以mysql_query在每次迭代中被調用並且重新調整爲真。

只需執行數據庫查詢一次,並緩存結果:

function addAds($n) { 
    $result = mysql_query("SELECT * FROM users"); 
    $aut = array(); 
    while ($row = mysql_fetch_array($result)) { 
     $aut[]=$row['name']; 
    } 
    $rowCount = count($aut); 
    for ($i=0; $i<=$n; $i++) { 
     $author=$aut[rand(0,$rowCount)]; 
     // … 
     mysql_query("INSERT INTO advert(author,name,type,text,time,catid,subid) VALUES('$author','$name','$type','$text','$time','$catid','$subid')") or die(mysql_error()); 
    } 
    echo "$n adverts successfully added."; 
} 
1

這是一個很大的時候,我不使用PHP,但我認爲分配

$row=mysql_fetch_array(mysql_query("SELECT * FROM users")) 

應該總是返回true,它會在每次迭代中一次又一次地執行查詢。

4

您可以用一行代替這個超級開關:

$subid = rand(($catid * 8) - 7, min($catid * 8, 70)); 
+1

+1發現TRWTF – 2010-05-30 22:26:38

+0

這並不完全正確。但這可能足以滿足湯姆的需求。 – Gumbo 2010-05-30 22:32:53

+0

@Gumbo:思考這個隨機,我認爲是一個很好的約;-)但是,如果他們不想aproxx他們可以添加到這3行,並得到100%的反思。 4行優於29. – Svisstack 2010-05-30 22:39:15

2

我也認爲問題是你的功能太大,無法理解(快速)。你應該讓它們變得更小,然後用像phpunit這樣的單元測試框架來測試它們。