2013-07-14 2 views
0

나는 mysql db에 저장된 페이지를 가지고 있으며, 필드 중 하나는 사이트 검색을 돕기를 원했던 각 페이지에 대한 태그 배열이다. 내 호출에 의해 발생하는 오류를 받고 있어요"Like"로 MYSQL 필드 배열 가져 오기

... 같은

$results = $db->select('pages','','','name',array('name', 'DESC'),'10',array('tags', '%' .$word. '%')); 

(선택 작품 - '테이블', '', '어디 검색어 검색에 대한 바인드', ' fields ','orderby array ','limit ', where/like array')

'태그'필드에 배열 문제가 있다고 생각합니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 필요한 경우, 나는 각각의 당기하고있어 쿼리 이후로 지금까지 결과 :

경고 :

//if we got something through $_POST 
if (isset($_GET['search'])) { 
// here you would normally include some database connection 
require_once('../config/dbconfig.php'); 

// never trust what user wrote! We must ALWAYS sanitize user input 
//$word = mysql_real_escape_string($_POST['search']); 
$word = htmlentities($_GET['search']); 
// build your search query to the database 
//$sql = "SELECT title, url FROM pages WHERE content LIKE '%" . $word . "%' ORDER BY title LIMIT 10"; 

$results = $db->select('pages','','','*',array('name', 'DESC'),'10',array('tags', '%' .$word. '%')); 

// get results 
if (count($results) > 0) { 
    $end_result = ''; 
    echo '<ul>'; 
    foreach($results as $row) { 
     $bold = '<span class="found">' .$word. '</span>'; 
     $end_result .= '<li>' .str_ireplace($word, $bold, $row['title']). '</li>'; 
    } 
    //echo $end_result. '</ul>'; 
}else { 
    //echo '<ul><li>No results found</li></ul>'; 
} 
var_dump($results); 
exit; 
} 

그것은 오류가 내 foreach 문에 말했다의 foreach에 대한 공급 잘못된 인수()

언제나 지금까지 내 쿼리로 인해서 왔습니다. 매번.

내가 찾지 못했다면 특별히 검색된 내용이 없습니다. 놓친 경우 매우 유감입니다. 또한 피곤해서 일부 정보를 놓친 경우 알려 주시면 게시 해 드리겠습니다. 감사!

선택을 실행하기 전에 선택이 처리되는 방식입니다.

public function select($table, $where="", $bind="", $fields="*", $order="", $limit="", $like="") { 
    $sql = "SELECT " . $fields . " FROM " . $table; 
    if(!empty($where)) { 
     $sql .= " WHERE " . $where; 
    } 
    if (!empty($order)) { 
     $sql .= " ORDER BY " . $order[0] . " " . $order[1]; 
    } 
    if (!empty($limit) && is_array($limit)) { 
     $sql .= " LIMIT " . $limit[0] . " " . $limit[1]; 
    } 
    if (!empty($limit)) { 
     $sql .= " LIMIT " . $limit; 
    } 
    if (!empty($like)) { 
     $sql .= " WHERE " .$like[0]. " LIKE " . $like[1]; 
    } 
    $sql .= ";"; 
    //var_dump($sql); 
    //var_dump($bind); 
    //exit; 
    return $this->run($sql, $bind); 
} 

public function run($sql, $bind="") { 
    $this->sql = trim($sql); 
    $this->bind = $this->cleanup($bind); 
    $this->error = ""; 

    try { 
     $pdostmt = $this->prepare($this->sql); 
     if($pdostmt->execute($this->bind) !== false) { 
      if(preg_match("/^(" . implode("|", array("select", "describe", "pragma")) . ") /i", $this->sql)) 
       return $pdostmt->fetchAll(PDO::FETCH_ASSOC); 
      elseif(preg_match("/^(" . implode("|", array("delete", "insert", "update")) . ") /i", $this->sql)) 
       return $pdostmt->rowCount(); 
     } 
    } catch (PDOException $e) { 
     $this->error = $e->getMessage();  
     $this->debug(); 
     return false; 
    } 
} 

은 (대신 URL로 페이지에 직접했다 그래서, $ _GET B/검색 c를 AJAX를 사용하고 물건을 그냥 전화 한 무리의 변경과 같은 느끼지 않았다로 전환.)

난 그냥 제거 해당 쿼리 편집에

나노, 그것은 바로 처음 ... 죄송합니다 피곤 ...

+0

태그 필드가 배열이라는 것은 무엇을 의미합니까? 배열은 MySQL에서 유효한 열 유형이 아닙니다. – jcsanyi

+0

또한 어떤 유형의 객체가'$ db'입니까? 나는'select()'메소드를 가진 것에 익숙하지 않다. – jcsanyi

+0

용어가 틀린 것 같습니다. '태그'라는 이름의 테이블에있는 필드 중 하나의 예가 'about, mission, what, is, imengine, studio'입니다. 나는 정말로 그것의 주석이있는 문자열을 추측한다. $ db는 데이터베이스와의 연결을 시작하기 위해 만들어진 객체입니다. 매우 싫어하는 포장지를 사용하여 연결을 유지합니다. 그것은 많은, 내가 가진 많은 다른 쿼리와 잘 작동합니다. – Grant

답변

0

한 문제가 아닌 배열 값에 count()을 사용하고 있다는 점이다.

배열이 아닌 배열을 배열로 변환하면 원래 값을 포함하는 단일 요소 배열이됩니다. 결과를 처리하고 코드 - $resultsfalsecount($results)을 수행 할 때

(array) 1234; // results in array(0 => 1234) 
(array) "ABC" // results in array(0 => "ABC") 
(array) false // results in array(0 => false) 

그래서, 값은 내부적으로 배열로 변환되며,이 단일 요소의 배열이기 때문에 당신은 1을받을거야 else 절 대신 실행됩니다.

여기에 표시되는 Invalid argument supplied for foreach() 오류 메시지의 원인입니다.


는 처음에 false를 반환 왜에 관해서는,의 생성되고있는 쿼리를 살펴 보자 :

SELECT name FROM pages ORDER BY name DESC WHERE tags LIKE %someword% 

여기에 몇 가지 문제가 실제로있다 :

  1. 귀하의 단어 가치는 인용되지 않습니다.그래서 쿼리가 끝나는 종료됩니다 :

    WHERE tags LIKE %someword% 
    

    그래서 하나의 오류는 %someword% 주위 누락 된 따옴표에 의해 발생합니다.

    나는 이것이 누락 된 SQL 주입을 방지하기 위해 값을 이스케이프하는 것과 함께 select() 함수의 책임이어야한다고 생각합니다.

    가장 좋은 해결책은 $like 매개 변수가 자동으로 ?을 사용하고 $bind 값을 추가하는 것입니다. 나는 $bind 그냥 배열 가정, 그래서 당신은 이런 식으로 뭔가를 할 수 :

    if (!empty($like)) { 
        if (empty($bind)) $bind = array(); 
        $bind[] = $like[1]; 
        $sql .= " WHERE " .$like[0]. " LIKE ?" 
    } 
    
  2. LIKE 조건은 쿼리의 끝에 추가지고 - 어떤 ORDER BYLIMIT 조항 후. 이것은 또한 잘못된 SQL 결과입니다. $like에 대한 추가 매개 변수가 필요하면 주문 후가 아니라 기존 $where 조건과 동시에 처리해야합니다. 당신이 $like을위한 7 매개 변수를 사용하는 이유

전반적인 결과를 보면, 단지 기존 $where 매개 변수에 "tags LIKE ?"를 전달하는 대신, 이해가 안 돼요. 대신에 오류가 그게 false를 반환하는 원인을 무엇으로 추측


, 왜 그냥 실제 오류 메시지를 살펴?

당신은 false를 반환하기 전에 오류 메시지를 저장하고 ... 그래서 당신은 당신의 if 상태의 시작이를 추가하는 경우 :

if ($results === false) { 
    echo($db->error); 
} elseif (count($results) > 0) { 

... 당신은 PDO가 정확히 볼 수 있어야합니다 에 대해 불평.

+0

나중에 문제가 있었으므로이를 지적 해 주셔서 감사합니다.:) 그것은 생각하지 않습니다. 내가 아는 어떤 것을 포함하도록 검색을 변경했습니다. 둘 이상을 반환 할 것이며, 단지 '이름'대신 모든 레코드를 가져오고 여전히 변경하지 않았습니다. – Grant

+0

나는 그 코멘트를 한 직후에 내 OP에 넣었다. – Grant

+0

은 같은 결과물을 추가했지만 동일한 결과가 추가되었습니다. 솔직히 말해서, 그것은 아주 좋은 지적이고 왜 나는 단지 그것을 어디에 놓아 두지 않았는지 모르겠다. 어느 쪽이든 여전히 같은 이슈를 가지고있을 것이다. 또한 OP에서 코드의 실행 부분을 쿼리에 추가했지만 뉴스 시스템, 로그인/아웃/레지스터, 로딩/편집/추가 페이지 등에서 잘 작동하므로 래퍼라고 생각하지 않습니다. . 'a, b, c, d'가있는 레코드와 관련이있는이 쿼리의 특정 항목과 여전히 생각하는 내용은 전에는 그렇게하지 않았기 때문에 무엇인지 모릅니다. – Grant