2014-04-07 66 views
1

我在我的PHP中有一個if和array語句,它顯示未定義的偏移量&未定義的變量。如何在下面的代碼中克服這兩個錯誤?如何克服PHP中的「undefined offset 0」和「undefined variable:str」通知?

未定義,偏移量爲0

未定義的變量:STR

function calc_pending_conf(){ 
$comm = array(); 
global $wpdb; 
$unsecurearray = array(); 
$nps = $wpdb->get_results("SELECT ID FROM wp_posts WHERE post_status = 'publish' AND post_type = 'post' AND comment_status = 'open'"); 
$numposts=0; 
foreach($nps as $np){ 
    if (comments_open($np->ID)){ 
     $numposts++; 
     $unsecurearray[]=$np->ID; 
    } 
} 
$allusers = $wpdb->get_results("SELECT ID FROM wp_users"); 
foreach ($allusers as $usr): 
    $comcount=0; 
    $args = array('user_id' => $usr->ID); 
    $usercomment = get_comments($args); 
    foreach($usercomment as $cot) : 
     if(in_array($cot->comment_post_ID,$unsecurearray)){$comcount++;} 
    endforeach; 
    $snumposts = $wpdb->get_var("SELECT COUNT(*) FROM wp_ps_security, wp_posts WHERE wp_ps_security.sec_protect_id = wp_posts.ID AND wp_posts.post_type = 'post' AND wp_posts.comment_status = 'open'"); 
    $unsecure = $numposts - $snumposts; 
    $cid = $usr->ID; 
    $groupid = $wpdb->get_results("SELECT grel_group_id FROM wp_ps_group_relationships WHERE grel_user_id = '".$cid."'"); 
    if(isset($groupid) && is_array($groupid) && is_object($groupid[0])): 
    if($groupid[0]->grel_group_id==11 || $groupid[0]->grel_group_id==3 || $groupid[0]->grel_group_id==1 || sizeof($groupid)==0): 
     $pendingc = 0; 
    else: 
     $applicable=0; 
     foreach($groupid as $grp){ 
      $str = $str."wp_ps_security.sec_access_id=".$grp->grel_group_id." OR "; 
     } 
     global $applicablearray; 
     $applicablearray = array(); 
     $aarray = $wpdb->get_results("SELECT DISTINCT wp_ps_security.sec_protect_id FROM wp_posts,wp_ps_security WHERE wp_posts.comment_status='open' AND wp_posts.post_status='publish' AND wp_posts.post_type='post' AND (".substr($str, 0, -3).") AND wp_posts.ID=wp_ps_security.sec_protect_id"); 
     foreach ($aarray as $aa) 
     { 
      $applicablearray[]=$aa->ID; 
     } 
     $applicable = sizeof($applicablearray); 

     $pendingc = $unsecure + $applicable - $comcount; 
    endif; 
    $wpdb->query("UPDATE wp_users SET confpending=".$pendingc." WHERE ID=".$cid); 
    update_user_meta($cid, 'confpending', $pendingc); 
endforeach; 

}

回答

0

檢查$ GROUPID前:

// you just need insert this line before your if statement: 
    if(isset($groupid) && is_array($groupid) && is_object($groupid[0])) 
    // Your code 
    if($groupid[0]->grel_group_id==11 || $groupid[0]->grel_group_id==3 || $groupid[0]->grel_group_id==1 || sizeof($groupid)==0): 
+0

現在它顯示語法錯誤,意想不到的'endforeach',我是初學者在PHP爲更好的清晰我粘貼全部功能。 – user3507199

+0

我複製粘貼從您的示例中的foreach,現在我將其刪除。 – Barif

+0

我試過,它也顯示語法錯誤,文件意外結束 – user3507199

1

不要使用變數聯合國界定?

使用isset確保變量在嘗試訪問它之前存在。

個人和自己不這樣做,但我個人設置錯誤報告爲E_ALL^E_NOTICE。這是一個糟糕的主意,我再次說你不應該這樣做,但如果你願意接受風險,如果你錯誤地鍵入單個變量名稱,事情會悄悄地搞砸了。

+0

好吧,如果你錯誤地輸入了一個變量名稱,它就會生成,你可能更喜歡一個錯誤信息,而不是一個你可能會注意到數週後失敗的代碼......但至少你明確表示這不是一個好主意: ) –

+0

理想情況下,在代碼投入生產之前,您會注意到一些事情:* p –

+0

事實上,如果您由於某種原因未能注意到它(例如:代碼可能因爲特定的用戶輸入而未通過測試)真的需要某種錯誤日誌,或者至少是錯誤消息。當用戶遇到錯誤時告訴用戶,如果沒有錯誤信息但沉默失敗時很難,告訴用戶可能會太遲,例如,數據庫中可能存在不一致的數據或數據缺失...但是,嘿,我不想討論這個,我寫了幾年前的'錯誤恢復下一個'的部分:-) –

1

php檢查是否條件懶惰,如果某事失敗,他不會繼續前進。例如IF(A AND B),如果A爲假,則B從不被檢查。

你可以在你的例子中使用它,你可以檢查isset($ groupID [0])和(其他所有東西)。

如果未設置$ groupID [0],則忽略整個if檢查。

相關問題