2016-06-18 3 views
0

나는 SQL 구문에별로 좋지 않아서이 문제에 대한 연구를 통해 데이터베이스 쿼리에서 열을 제외하는 예제를 보았지만 반환되는 실제 테이블 결과는 찾지 못했습니다. PHP 스크립트는 아래의 SQL 쿼리를 실행SELECT 쿼리에서 특정 SQL 결과 건너 뛰기

:

$query = $db->query("SELECT `team`, `points`, `goalsfor`, `goalsagainst`, `goalsdifference`, `matches`, `wins`, `draws`, `losses` FROM `".TABLE_PREFIX."myleagues_rows` WHERE `league` = {$lid} ORDER BY `points` DESC, `goalsdifference` DESC, `goalsfor` DESC, `goalsagainst` ASC"); 

다시 다음 참조를하고 형식의 HTML 테이블에 데이터를 삽입, 쿼리의 다음 부분 :

while($row = $db->fetch_array($query)) { 
     foreach($row as $name => $value) { 
      $teams[$row['team']][$name] = $value; 

Full link PHP 파일에 중요한 것들이 누락되었습니다.

제 질문은 팀 이름이 "Test"인 테이블에 반환 된 행과 서식이 지정된 테이블에 삽입 된 행이 있다는 것입니다. 나는 데이터베이스에서 테스트 팀을 제거하고 싶지 않지만 형식화 된 테이블에서 제외하려고합니다.

SQL 쿼리를 가장 잘 수정합니까? 아니면 대신 PHP 측에서 할 수있는 일이 있습니까?

잘못된 조언을 주셔서 감사 드리며 잘못된 방향을 찾고 있다면 올바른 방향으로 알려주십시오. 코드를 작성하지 않았습니다.

답변

0

당신은 WHERE 문을 사용하여 SQL 쿼리에서 제거 할 수 있습니다 (I는 "팀"을 추측하고있어 이름인가?) : 당신이 관찰 한 것처럼

$query = $db->query("SELECT 
    `team`, 
    `points`, 
    `goalsfor`, 
    `goalsagainst`, 
    `goalsdifference`, 
    `matches`, 
    `wins`, 
    `draws`, 
    `losses` 
FROM `".TABLE_PREFIX."myleagues_rows` 
WHERE 
    `league` = {$lid} 
    AND `team` != 'test' 
ORDER BY 
    `points` DESC, 
    `goalsdifference` DESC, 
    `goalsfor` DESC, 
    `goalsagainst` ASC"); 
0

, 여기에 두 가지 옵션이있다 : 변화 데이터베이스 쿼리 또는 결과를 처리하는 PHP 변경.

또는
SELECT 
    `team`, 
    `points`, 
    `goalsfor`, 
    `goalsagainst`, 
    `goalsdifference`, 
    `matches`, 
    `wins`, 
    `draws`, 
    `losses` 
FROM 
    `{{TABLE_PREFIX}}myleagues_rows` 
WHERE 
    `league` = {{$lid}} AND 
    `team` <> 'Test' 
ORDER BY 
    `points` DESC, 
    `goalsdifference` DESC, 
    `goalsfor` DESC, 
    `goalsagainst` ASC 
; 

당신이 if 문을 추가하여이 팀을 제외 할 PHP를 수정할 수 있습니다 : 데이터베이스 쿼리를 변경

다음과 같을 수있는의 WHERE 절에 추가 용어를 추가하는 것만 큼 간단합니다 :

while($row = $db->fetch_array($query)) { 
    if ($row['team'] !== 'Test') { 
     foreach($row as $name => $value) { 
      $teams[$row['team']][$name] = $value; 
     } 
    } 
} 

그럼 어떤 것이 가장 좋습니까? 여러분이 직면하게 될 문제는 "테스트"팀을 제외시키는 코드가 계속해서 팀 목록을 쿼리하려고 할 때마다 계속해서 반복 해 나갈 것이라는 것입니다. 당신은 아마 더 높은 수준의 추상화에이 코드를 밀어 원하는 : 같은 Doctrine 같은 데이터베이스에 대해

  • 보다는 만드는 원료 쿼리, 왜 객체 관계형 매퍼 (ORM)의 일종을 사용하지? - 테스트 행을 제외한 코드 행은 입니다. "팀"모델을 쿼리 할 때마다 테스트 행을 제외 할 수도 있습니다.
  • 또는 논리를 데이터베이스로 푸시 할 수 있습니다. 테스트 행을 제외하는 뷰를 생성합니다. 그런 다음 기본 테이블이 아닌 새 뷰에 대해 쿼리를 실행할 수 있습니다. 이것은 "TABLE_PREFIX"메카니즘을 사용하는 것이 매우 쉽습니다.

필자가 작성하는 동안 데이터베이스에 전달하는 값 $lid의 유효성이 제대로 검사되었는지 확인하는 것이 좋습니다. SQL Injection 공격에 취약 할 가능성이 있으므로 문자열을 연결하여 데이터베이스 쿼리를 조합하는 것은 일반적으로 나쁜 습관으로 간주됩니다.ORM 경로를 거치지 않으려면 Prepared Statements을 허용하는 데이터베이스 라이브러리로 전환하는 것이 좋습니다. 최소한으로 당신은 당신의 $lid이 당신이 예상하는 범위의 정수 값인지 확실히 확인해야합니다.

+0

두 번째 예에서는 값이 "Test"인 필드를 제외하고 "test"-record의 모든 열을 그에게 넘겨주지 않습니까? 그리고 iit은 "Test"가 아닌 "Test"가 포함 된 다른 레코드도 무시합니다. –

+0

@ MagnusEriksson 좋은 장소 - 고칠 것입니다. – simpleigh

+0

@MagnusEriksson 그것은 공정한 비판입니다. 그러나 쿼리가 거의없는 앱은 종종 쿼리가 많은 앱으로 발전하고 잠재적으로 다시 돌아 가기에는 너무 늦었습니다. 또한 $ lid를 통해 잠재적 인 SQLi 벡터를 피할 수 있습니다. – simpleigh