2017-10-31 8 views
1

저는 전보 봇을 쓰고 있습니다. SQL SELECT 문으로이 문제가 발생했습니다. 여기
는 스크립트입니다SQL SELECT 문이 PHP에서 작동하지 않습니다

$chat_id = $update->message->chat->id; 

$check_user = $con->query("SELECT * FROM Users WHERE chat_id='".$chat_id."'"); 
if($check_user->rowCount() > 0){ 

    $user_data = $check_user->fetchAll(); 
    $user_status = 'active user'; 
}else{ 
    $user_status = 'new'; 
} 

채팅 ID가 나는 사용자 프로필에서 얻을하고 데이터베이스 여부에 존재하는지 확인 정수 VAR이다; 그러나 비록 그 chat id가 이미 데이터베이스에 존재하더라도, 무엇을 상관없이 항상 user_status를 'new'로 설정합니다.

사용자 이름과 함께이 SQL SELECT를 실행하기 때문에 데이터베이스에 사용자 이름도 저장합니다 (문자열).

무엇이 문제입니까?
업데이트 : 방금 'mysqli'를 시도했지만 불행히도 같은 결과를 얻었습니다.

+0

이것은 바로 mysql입니까? – bassxzero

+0

@bassxzero'fetchall()'-> PDO 내 생각 엔 –

+0

@MasivuyeCokile PDO는 많은 데이터베이스 엔진에 대한 래퍼입니다. – bassxzero

답변

1

대부분의 데이터베이스에서 PDOStatement :: rowCount()는 SELECT 문에 의해 영향을받는 행 수를 반환하지 않습니다. 대신 PDO :: query()를 사용하여 술어를 원하는 SELECT 문으로 사용하여 SELECT COUNT (*) 문을 실행 한 다음 PDOStatement :: fetchColumn()을 사용하여 이 반환 될 행 수를 검색하십시오 . 그러면 응용 프로그램이 올 Y 른 조치를 수행 할 수 있습니다. 확인이 link 당신이 알고 싶다면

* chat_id는

$chat_id = $update->message->chat->id; 

$check_user = $con->query("SELECT * FROM Users WHERE chat_id = $chat_id"); 
if($check_user->fetchColumn() > 0){ 

    $user_data = $check_user->fetchAll(); 
    $user_status = 'active user'; 
}else{ 
    $user_status = 'new'; 
} 
+2

그 차이는 없습니다. – chris85

+0

이것이 mysql이면 '1'(문자열)을 '1' (int)로 변환합니다. 그래서 그것은 차이를 만들지 않을 것입니다. – bassxzero

+0

나는 여전히 같은 결과를 얻습니다! – HamidR

0

당신 ID에서 시세 및 점을 제거하여 쿼리에서 작은 따옴표를 제거해야합니다 정수 경우

$check_user = $con->query("SELECT * FROM Users WHERE chat_id='$chat_id'"); 
+0

mysql이면 '1'을 캐스팅합니다 (문자열)을 '1' (int)로 설정합니다. 그래서 그것은 차이를 만들지 않을 것입니다. – bassxzero

+0

네,하지만 그는 PDO를 사용하고 있습니다. 그래야 작동합니다. –

+1

나는 당신의 코드가 그의 코드와 정확히 동일하다고 말하고 있습니다. – bassxzero

1

rowCount()은 마지막 DELETE, INSE의 영향을받는 행 수를 반환합니다. RT 또는 UPDATE.을 사용하여 해당 PDOStatement 오브젝트에 의해 실행됩니다.

그래서 rowCount()는 select 문을 사용하여 실제로 신뢰할 수 없습니다. 그런 다음 select를 수행 한 다음 PDOStatement :: fetchAll을 사용하여 모든 결과 집합 행을 포함하는 배열을 반환하고 배열이 더 큰 0보다 상태를 설정하십시오.

<?php 
$chat_id = $update->message->chat->id; 

$check_user = $con->prepare("SELECT * FROM Users WHERE chat_id = ? "); 
$check_user->execute([$chat_id]); 
$user_data = $check_user->fetchAll(); 

if (count($user_data) > 0) { 

    $user_status = 'active user'; 
}else{ 

    $user_status = 'new'; 
} 
+0

여전히 같은 결과! – HamidR

+0

@HamidR 신분증을 가지고 계시 니? –

+0

그래, 인쇄 할 수 있고 스크립트에서 여러 번 사용했습니다. – HamidR