2010-08-11 4 views
0

내 목표는 사용자의 프로필을 표시하는 것입니다. 나는이 기능을 가지고 :PHP 배열에 mysql 리소스를 추출 하시겠습니까?

function get_profile($un) { 
      if($registerquery = $this->conn->query("SELECT * FROM table WHERE usr = '".$un."' ")){ 
       return $profile = mysql_fetch_array($registerquery); 
      } 
     } 

그리고 디스플레이 스 니펫 (snippet) :

<?php $profile = $mysql->get_profile($un); 

foreach($profile as $key => $value){ 

    echo "<span>".$key.': '.$value."</span><br />"; 

    } 

?> 

하지만 얻을 : PLS

도움말 : "경고에 ... foreach는()에 대한 공급 잘못된 인수"? ??

+1

get_profile의 반환 값은 무엇입니까? – darma

+0

아마도 여기에 뭔가가 있어야합니다. 여기에 있어야합니다.) –

+0

@ 루카스 : 그냥 편집했습니다. 죄송합니다 .. – Joann

답변

1

당신은 볼 필요가 그리고 자원 유형의 경우는 순환 필요 내가 그것을 풀 수 없기 때문에 기본적으로 모든 것을 당신에게 아주 끔찍한 코드로 만들었습니다. 미안 해요. 당신은 MySQLi와 MySQL의 기능을 혼합하고

function get_profile($un) { 
    if($result = $this->conn->query("SELECT * FROM table WHERE usr = '".$un."' ")){ 
     return $result->fetchArray(MYSQLI_ASSOC); 
    } 
    return array(); 
} 

당신이 그렇게 할 수 없습니다

0

get_profile의 결과를 확인하십시오. 쿼리가 실패하면 null을 반환합니다. null을 반복 할 수 없습니다.

+0

예, 그것은 null입니다. 나는 문제가 "반환"선이라고 의심한다. 할당은 아무 것도 지정하지 않습니다 ... – Joann

+0

'$ profile'에 결과를 할당하는 것은 함수에서'global $ profile'을 선언하지 않았기 때문에 아무런 일도하지 않습니다. 그 대신 직접 결과를 반환하고 값을 캡처하십시오. 문제는 MySQL-> conn-> query' 어딘가에 있어야합니다. –

+0

이것은 "conn"을 얻은 방법입니다. 그것은 mysqli의 새로운 인스턴스입니다. \t private $ conn; \t \t 함수 __construct() { \t \t $ this-> CONN = 새로운 mysqli (DB_SERVER_USERS, DB_USER_USERS, DB_PASSWORD_USERS, DB_NAME_USERS) 또는 \t \t \t \t \t 다이 ('베이스에 연결하는 문제가 있었다.') ; \t} – Joann

0

나는 Anthony Forloney와 동의한다. 다음 코드는 TRUE 또는 $profile 변수를로드 거세한 숫양에 따라 FALSE가 일 반환 : 당신은 $profile 필요하지 않습니다

return $profile = mysql_fetch_array($registerquery); 

. 당신은 등을 제거 할 수 있습니다 :

return mysql_fetch_array($registerquery); 

함수는 배열을 반환하고 함수를 호출 할 때 다음과 같은와 마찬가지로 다음 나중에 $profile로 반환 값의로드 할 수 있습니다

$profile = $mysql->get_profile($un); 
+0

작동하지 않는다. $ profile을 에코하려고 시도했지만 아무것도 표시되지 않으므로이 함수는 null을 반환합니다. – Joann

+0

네, 쿼리가 아무것도 반환하지 않는다고 생각합니다. 'SELECT 1,2,3'와 같은 간단한 쿼리를 사용하여 나머지 함수가 제대로 작동하는지 확인하십시오. – Andrew

0

아주 조심해야합니다. 원시 문자열을 이스케이프 처리하지 않고 매개 변수화 된 쿼리를 사용하지 않고 쿼리 함수에 전달합니다. 쿼리에서 $ un 주위에 mysql_escape_string을 사용하십시오. 코드 결함은 SQL 주입 공격이라고합니다.

사람이

myusername'; update users set password = ''; 

그리고 빈 모든 암호와 같은 사용자 이름을 통과하여 자신이 어떤 계정에 액세스 할 수 있도록 할 수있다. 비슷한 그늘진 공격도 똑같이 가능합니다. 기본적으로 SQL 주입 공격으로 데이터베이스에 대해 아무 것도 할 수 있습니다.

if (gettype($result) == "resource") { 
    if (mysql_num_rows($result) != 0) { 
     while ($row = mysql_fetch_assoc($result)) { 
      $output[] =$row; 
     } 
    } 
} 

내가 진짜 다진 ... 결과가

if (gettype($result) == "boolean") { 
    $output = array('success' => ($result ? 1 : 0)); 
} 

성공했다 아닌지

0

이 시도해보십시오. 그리고이 코드의 마지막 줄은 null을 반환하지 않고 쿼리가 작동하지 않으면 빈 배열을 반환합니다.

$select = "SELECT * FROM MyTable"; 
$result = mysql_query($select); 
while ($profile = mysql_fetch_array($result)) { 
    $name = $profile['name']; 
    ... 
} 
-1

나는 MySQL의 결과를 통해 반복하는 가장 쉬운 방법은 while 루프를 사용하는 것으로 나타났습니다."count ($ profile)"값을 출력하십시오.

+0

배열 키를 작은 따옴표로 묶어야합니다. 그렇지 않으면 상수를 먼저 검색 한 다음 '이름'으로 되돌려 놓습니다. 이는 매우 나쁜 습관입니다. 또한 바닐라 MySQL 함수 대신 MySQLi 메서드를 사용하는 것이 훨씬 더 좋습니다. – Stoosh

+0

흥미 롭습니다. MySQLi 기능이란 무엇입니까? 할 수있을 때마다 코드를 개선하는 것이 좋습니다. 큰 따옴표 세트 안에 배열 키를 호출 할 때를 제외하고 작은 따옴표를 사용합니다. 이 경우에도 작은 따옴표를 사용하지 않는 것이 좋습니다. – smfoote

0

그것은 아마 빈 ($ 프로파일)입니다 :