2012-05-24 6 views
1

저는 StackExchange를 모두 위아래로 움직였습니다. 그리고 적은 수의 사이트에 대한 인터넷의 풍요 로움의 많은 부분에서 제 코드가 작동하지 않는 이유를 찾았지만이 하나가 저를 곤란하게합니다. 특정 MySQL 테이블의 전체 행 수를 표시하고 나중에 스크립트에서 사용할 변수로 개수를 설정하려고합니다. 다음을 실행하면 스크립트가 종료되고 PHP 경고가 표시됩니다. mysql_result()는 매개 변수 1이 리소스 문자열이 될 것으로 예상합니다.mysql_query가 리소스를 반환하지 않습니다.

StackOverflow의 공동 천재는 무엇을 생각합니까? 이 오류가 여기에 매우 높습니다

$conn = mysql_connect('127.0.0.1', 'username', 'password'); 
if (!$conn) { 
    die('Connect Error ' . mysql_error()); 
} 
mysql_select_db('my_database', $conn); 
if (!mysql_select_db('my_database')) { 
    die('Could not select database: ' . mysql_error()); 
} 
$max_count_query = ("SELECT COUNT(*) FROM directory_nap"); 
// Perform Query 
$max_count_action = mysql_query($max_count_query); 
if (!$max_count_action){ 
    die('mysql query error: ' . mysql_error()); 
    } 
$mcount = mysql_result($max_count_action, 0, 0); 
if (!$mcount){ 
    die('mysql result error: ' . mysql_error()); 
    } 
printf("\nNumber of Records to Process: ", $mcount); 
+1

괄호로 묶어 놓지 않았습니까? – Sebas

+1

연결이 제대로 작동하는지 확인하고 작업 한 DB를 선택했는지 확인하지만 쿼리를 확인하지는 않습니다. –

+0

시도하십시오 : SELECT COUNT (all) from ... –

답변

4

제공됨 table tablename은 예제 일뿐입니다 (bitfox의 대답 참조). 코드에는 아무런 문제가 없습니다. 테스트 서버에서 동일한 코드를 사용하고 테이블 이름을 내 자신의 db에있는 것으로 변경하여 결과를 얻을 수 있습니다.

가장 문제가되는 것은 오류라고 표시하는 것입니다. mysql_result() expects parameter 1 to be resource, string given - SQL에 오류가있는 경우 mysql_query은 문자열이 아닌 부울 (docs)을 반환합니다. 따라서 실제로 사용하는 것과 동일한 테스트 코드가 표시되지 않거나 부정확 한 오류 메시지가 표시됩니다.

어느 시점에서 문자열을 변수 $max_count_action에 할당해야합니다. 의도적 인 문제가있는 쿼리를 보낼 때 얻을 수있는 것은 다음과 같습니다. Warning: mysql_result() expects parameter 1 to be resource, boolean given - 문자열이 아니라 "부울"참고.

그래서 첫 번째 단계는 다른 테이블 이름을 선택하는 것입니다.

SELECT COUNT(*) FROM `table` 

두 번째 단계는 $max_count_action에 무슨 일이 일어나고 있는지 볼 수 있습니다 : 당신은 테이블 또는 열 이름으로 예약어를 사용하는 경우 즉, 여전히 백틱 (`) 문자의 문자열을 둘러싼하여 액세스 할 수 있습니다 말했다 그것을 문자열로 변환합니다. 마지막으로, mysql_error을 일관되게 사용하여 디버그하십시오. 그러나 프로덕션 코드에 대해서는 die보다 조금 더 좋게 제안 할 것입니다.

// working code on my test server 
$max_count_query = ("SELECT COUNT(*) FROM users"); 
$max_count_action = mysql_query($max_count_query); 
$mcount = $max_count_action ? mysql_result($max_count_action, 0) : 'Error: '.mysql_error(); 
print "\nNumber of Records to Process: ". $mcount; 
+0

나는 그런 오류에 깊은 당황해했다. 위의 내용으로 코드를 변경 한 후, mysql_result()는 적어도 2 개의 매개 변수, 1 개의 주어진 매개 변수를 기대합니다 .' ... 공식 문서의 형식과 일치하도록 최선을 다 했으므로 연구 결과 그래도 오류는 지속됩니다. – skandalfish

+0

mysql_result에 필요한 두 번째 매개 변수가 누락되었습니다. 지금 시도하십시오. –

+0

내 실행 코드는 게시 한 것과 매우 유사합니다. 감사합니다. 지금 보는 것이 훨씬 낫습니다. ;) – skandalfish

1

을 : 코멘트에 대응

, 내가 제공하는 코드의 또 다른 미니 슬래브를

SELECT COUNT(*) FROM table 

"테이블은" SQL 언어의 예약어. 변경해야합니다.

+1

나는 그가 그것을 예로 든 것으로 추측하고있다. 많은 사람들은 그것이 보안상의 위험이 될 수 있다는 잘못된 믿음에 실제 가치를 게시하지 않는다. –

+0

Dagon 있습니다. 이 테이블은 실제로'directory_nap '이라고 불린다. 그래도 잘 잡는다. 빠른 답장을 보내 주셔서 감사합니다! – skandalfish

+0

확인. 천만에요! – bitfox

0

질문의 '표'가 코드의 자리 표시 자 또는 실제 이름입니까? 그렇지 않으면 나는 (그것이 잘못된 테이블 이름이 될 수 대신 mysql_result

$max_count_query = "SELECT COUNT(*) FROM t"; 
// Perform Query 
$max_count_action = mysql_query($max_count_query) or die (mysql_error()); 
$mcount = mysql_fetch_array($max_count_action); 
printf("\nNumber of Records to Process: ", $mcount[0]); 
1
문제의 원인은 코드 샘플에서 명확하지 않다

mysql_fetch_array을 시도하고 싶습니다, 당신의 '테이블'테이블의 또 다른 이름을 변경하려고 쿼리 문자열 주변의 괄호 등), 그러나 거기에는 많은 부정확성이 있습니다. 당신은 적어도 몇 측의 버그를 수정하고 오류에 대한 자세한 내용을 제공해야, 다음 코드를 시도 할 수 있습니다 :이 도움이

$conn = mysql_connect('mysql_server', 'username', 'password'); 
if ($conn === false) { 
    die('Connect Error ' . mysql_error($conn)); 
} 
if (mysql_select_db('my_database', $conn) === false) { 
    die('Could not select database: ' . mysql_error($conn)); 
} 
$max_count_query = "SELECT COUNT(*) FROM table"; 
// Perform Query 
$max_count_action = mysql_query($max_count_query, $conn); 
if($max_count_action === false) { 
    die('Query error ' . mysql_error($conn)); 
} 
$mcount = mysql_result($max_count_action, 0, 0); 
if($mcount === false) { 
    die('Result retrieval error ' . mysql_error($conn)); 
} 
printf("\nNumber of Records to Process: %s", $mcount); 
mysql_free_result($max_count_action); 

희망, 안녕!

0
$conn = mysql_connect('mysql_server', 'username', 'password'); 
if (!$conn) { 
    die('Connect Error ' . mysql_error()); 
} 

이이 의문이다, OK이지만, 연결하고 다시 2 선

mysql_select_db('my_database', $conn); 

에 분할 할 필요가 없습니다 coditional. 여러 데이터베이스를 사용하는 경우 SQL에서 데이터베이스를 참조하는 것이 PHP 코드 내에서 상태를 추적하는 것보다 훨씬 간단하고 안전합니다.

if (!mysql_select_db('my_database')) { 
    die('Could not select database: ' . mysql_error()); 
} 

아직 완료하지 않았습니까?

$max_count_query = ("SELECT COUNT(*) FROM table"); 

왜 대괄호입니까?

// Perform Query 

코드에서 분명하지 않습니까?

$max_count_action = mysql_query($max_count_query); 
$mcount = mysql_result($max_count_action, 0, 0); 

db handle을 mysql_query 호출에 전달하는 것이 더 낫습니다.

연결 후 오류를 검사했는데 데이터베이스를 전환 한 후에 오류를 확인했지만 mysql_query() 후에 오류를 확인하지 않았습니까? 은 mcount argument.Try에 대한 형식 문자열에는 자리가 없다

printf("\nNumber of Records to Process: ", $mcount); 

:

printf("\nNumber of Records to Process: %d", $mcount); 

I get a PHP warning, telling me that mysql_result() expects parameter 1 to be resource, string given.

그런 다음 실행중인 코드는 당신이 우리를 표시 한 코드가 아닙니다가; mysql_query()는 문자열을 반환하지 않습니다.

+1

답변이 적고 코드 검토가 더 많음 : –

+0

내 기술 수준에서 코드 검토도 환영합니다! '$ max_count_action'를'$ res'로 이름을 변경하고 symcbean의 자리 표시자를 추가했는데 문제를 해결하는 것으로 보입니다. 왜 그런 방법으로 리소스를 명명하면 유용성에 영향을 미칠지 모르겠습니다. 나는'$ result'를 설정 해제 할 수 없으므로 그 이름을 부여했습니다. 코드에 대한 몇 가지 다른 쿼리가 있으며, 이들 모두로부터 반환 된 데이터는 동시에 필요합니다. 당신의 후한 기부에 많은 감사드립니다! – skandalfish

관련 문제