0

내 테스트 환경에는 이름, 전자 메일, 주소 등의 일부 개인 정보가 포함 된 데이터베이스가 있습니다. 이러한 정보는 누구든지 양식을 통해 데이터베이스에 삽입 할 수 있습니다. 백그라운드에서는 제출 후 매개 변수화 된 을 데이터베이스에 삽입합니다.
지금 내가하고 싶은 것은 어떤 사람이 동일한 값을 데이터베이스에 다시 삽입하려고 시도하는지 감지하고, 그럴 경우 새 값을 삽입하지 않고 대신 오류 메시지를 표시하는 것입니다. (따라서 데이터베이스의 모든 사람 이름은 고유하며 한 이름에 여러 행이 연결되어 있지 않습니다.
나는 이것을 달성하는 방법에 대한 많은 아이디어를 가지고있었습니다. 내 첫 번째는 REPLACE 또는 INSERT IGNORE과 같은 쿼리를 사용하는 것이지만이 방법은 오류 메시지를 표시 할 수 있도록 나에게 피드백을 제공하지 않습니다.
두 번째 시도는 먼저 행이 이미 있는지 확인하고 num_rows이 0보다 큰 경우 오류 메시지가 표시되고 exit 인 경우 - 쿼리를 수행 한 다음 다른 사람이 INSERT -part를 수행하는 것입니다. 이 기능을 사용하려면 SELECT에 매개 변수화 된 쿼리를 사용해야합니다. 일부 사용자 입력을 입력해야합니다. 매개 변수화 된 쿼리가 적은 코드 행으로 일반적으로 수행 할 수있는 모든 작업에 특수 함수가 필요하다는 것을 알게 된 후 인터넷에서 my $ statement parameterized-statement-object에서 num_rows을 얻는 방법을 연구했습니다. 이것은 내가 결국 한 것입니다 : mysqli 여전히 이뤄져 내 문에서 나에게 num_rows을 줄 이유PHP/mysqli : num_rows가 항상 반환되는 준비된 문

$connection = new mysqli('x', 'x', 'x', 'x'); 
if (mysqli_connect_error()) { 
    die("Connect Error"); 
} 
$connection->set_charset("UTF-8"); 
$statement = $connection->stmt_init(); 
$statement = $connection->prepare('SELECT Name FROM test WHERE Name LIKE ?'); 
flags = "s"; 
$statement->bind_param($flags, $_POST["person_name"]); 
$statement->execute(); 
$statement->store_result(); 
$result = $statement->get_result(); //Produces error 
if ($result->num_rows >= 1) { 
    $output = "Your already registered"; 
} else { 
    $output = "Registering you..."; 
} 
exit($output); 

결국, 내가 도착 할수 없어. 어떤 도움을 주셔서 감사합니다, 미리 감사드립니다!
아, 그리고 너희들이 내게 내가 뭘해야한다고 설명 할 수 있다면 affected_rows, 그 멋진 것입니다!

편집 : 고유 한 제약 조건을 사용하여이 작업을 수행 할 수 있음을 알고 있습니다. 나는 또한 INSERT IGNOREINSERT을 건너 뛰는 지 알아낼 수 있다는 것을 알게되었습니다. 하지만 그건 내 완전한 질문에 대답하지 않을 것입니다 : 왜 SELECT num_rows 대안이 효과가 없습니까?

다른 편집 : 나는 코드 스 니펫을 현재 ​​가지고있는 것으로 바 꾸었습니다.) (정의되지 않은 방법 mysqli_stmt에 전화 : get_result : 내 MySQL은 (내가) -version이 5.6.33 것 같다 있지만) (get_result (나는 $connection->server_info를 통해 그것을 echo'd) 다음과 같은 오류 메시지가 생성됩니다
치명적인 오류 X 줄의 X (라인 get_result)

+1

보호하려는 데이터베이스 열에 대해 UNIQUE 제약 조건은 어떻습니까? –

+0

@Kevin_Kinsey 왜 num_rows가 작동하지 않는 걸까요? 향후 프로젝트에서 매개 변수화 된 mysqli 문과 쿼리를 사용하여 num_rows 및 affected_rows를 가져 오는 방법을 알고 있으면 유용합니다. 그래도 제안을 주셔서 감사합니다! – SearchingSolutions

+0

'fetch()'대신'execute()'를 시도하십시오. – Machavity

답변

0

mysqli_num_rows()의 동작은 버퍼링 된 결과 세트 또는 버퍼링되지 않은 결과 세트가 사용되는지 여부에 따라 다릅니다. 버퍼링되지 않은 결과 집합의 경우 결과에있는 모든 행이 검색 될 때까지 은 올바른 행 수을 반환하지 않습니다. 행 수가 PHP_INT_MAX보다 큰 경우 숫자는 문자열로 반환됩니다.

또한 ->store_result()을 먼저 선언해야합니다. 또한 과 공동으로 사용하는 LIMIT에서는이 기능이 작동하지 않습니다. 발견 된 총 행을 얻으려면 수동으로 수행해야합니다.

편집 :

제안에서 아무것도 당신을 위해 작동하지 않는 경우, 나는 당신의 SQL 쿼리 재 작성을 제안합니다 :

SELECT `Name`, (SELECT COUNT(*) FROM `Persons`) AS `num_rows` FROM `Persons` WHERE `Name` LIKE ? 

이 쿼리가 Persons에서 총 수를 반환됩니다 테이블, Name (존재하는 경우).

+0

많은 항목을 다루지 않으므로'PHP_INT_MAX'는 제게 문제가되지 않습니다. 위의 예에서와 같이'store_result()'를 선언하고 있습니다. 내 웹 브라우저가 지원하지 않기 때문에'get_result()'를 사용할 수 없습니다. 그러면'num_rows()'를 어떻게 가져올 수 있습니까? – SearchingSolutions

+0

이 쿼리는 값이 아직 존재하지 않을 때에도 num_rows를 1로 반환합니다 : ... – SearchingSolutions

+0

편집을 다시 참조하십시오 – bodi0