2012-08-29 5 views
0

일부 코드를 최적화하려고 할 때 다른 질문이 나타났습니다 .. 사용자 그룹 및 사용 권한을 사용하여 사용자가 제한된 사용 권한을 가질 때 간혹 WHERE 절을 추가해야합니다. 전체 쿼리 if {...},하지만 그 한 줄을 제외하고 동일한 코드를 반복하는 것을 의미 할 것입니다 .. 그래서 전 문장을 반복하는 대신 if 조건에 따라 문을 빌드하는 코드를 변경했습니다 (문, 준비, 실행, 가져 오기 ..) :조건에 따라 MySQLi 선택적 WHERE 절

if (in_array('Edit own', $_SESSION['user_r'])) 
{ 
    $sql = 'SELECT 
       `news_id` 
      FROM 
       `news` 
      WHERE 
       `news_user_id` = "' .$_SESSION['user_id']. '"'; 
} 
else if (in_array('Edit all', $_SESSION['user_r'])) 
{ 
    $sql = 'SELECT 
       `news_id` 
      FROM 
       `news`'; 
} 

나는 수도 있습니다 알고있다 "분할"문을,이 같은 문 내 경우 조건을 사용하여 :

$sql = 'SELECT 
      `news_id` 
     FROM 
      `news`'; 

if (in_array('Edit own', $_SESSION['user_r'])) 
{ 
    $sql .= ' WHERE 
       `news_user_id` = "' .$_SESSION['user_id']. '"'; 
} 

언뜻 2. 예는 더 반복이 없기 때문에 "더 나은"이 될 수 있으며, 코드는 짧은이지만 준비된 문 및 bind_param()에 관해서는, 첫 번째 예는, 더 좋을 수도 I 때문에 직접 if {...} 내부의 문 뒤에

$stmt = $db->prepare($sql); 
$stmt->bind_param('ss', $what, $ever); 

을 추가 ... 어떻게 든 그것은 나에게 더 안전한 것 같다 ...

을 그래서 어떤 솔루션을 선호해야 할 수 있습니까? 다른 답이 없기 때문에

+0

FWIW는, PDO는'$ stmt-> 실행 ($의 params_array)를'수행 할 수 있습니다 http://php.net/manual/en/pdostatement.execute.php ...하지만 그것은 아마를 위해 전환 한 가치가 없어 그. – EthanB

+0

@EthanB 동의합니다. PDO로 전환하는 것은 너무 많을 수는 있지만 언젠가는 PDO를 배우는 것을 고려할 것입니다.하지만 필요가 있는지 확인하기 위해'if {...} '를 사용해야합니다. WHERE 절 또는 그렇지 않은가? – qlt

+0

예, 가능합니다 : http://pastebin.com/aD3HsWAA – EthanB

답변

0

, 내 "솔루션"을 공유하려는 : 이미 내 질문에 언급

if (in_array('Edit own', $_SESSION['user_r'])) 
{ 
    $sql = 'SELECT 
       `news_id` 
      FROM 
       `news` 
      WHERE 
       `news_user_id` = ?'; 

    $stmt = $db->prepare($sql); 
    $stmt->bind_param('i', $_SESSION['user_id']); 

} 
else if (in_array('Edit all', $_SESSION['user_r'])) 
{ 
    $sql = 'SELECT 
       `news_id` 
      FROM 
       `news`'; 

    $stmt = $db->prepare($sql); 
} 

$stmt->execute(); 
$stmt->bind_result($news_id); 
... 

으로, 내가 사용하고 문이 이제 전체 문을 구축합니다. 그런 식으로, if 문 안에 bind_param을 사용할 수 있지만 (필요한 경우) execute/fetch 부분을 반복 할 필요가 없습니다.