내 테스트 환경에는 이름, 전자 메일, 주소 등의 일부 개인 정보가 포함 된 데이터베이스가 있습니다. 이러한 정보는 누구든지 양식을 통해 데이터베이스에 삽입 할 수 있습니다. 백그라운드에서는 제출 후 매개 변수화 된 을 데이터베이스에 삽입합니다.
지금 내가하고 싶은 것은 어떤 사람이 동일한 값을 데이터베이스에 다시 삽입하려고 시도하는지 감지하고, 그럴 경우 새 값을 삽입하지 않고 대신 오류 메시지를 표시하는 것입니다. (따라서 데이터베이스의 모든 사람 이름은 고유하며 한 이름에 여러 행이 연결되어 있지 않습니다.
나는 이것을 달성하는 방법에 대한 많은 아이디어를 가지고있었습니다. 내 첫 번째는 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 IGNORE
이 INSERT
을 건너 뛰는 지 알아낼 수 있다는 것을 알게되었습니다. 하지만 그건 내 완전한 질문에 대답하지 않을 것입니다 : 왜 SELECT num_rows
대안이 효과가 없습니까?
다른 편집 : 나는 코드 스 니펫을 현재 가지고있는 것으로 바 꾸었습니다.) (정의되지 않은 방법 mysqli_stmt에 전화 : get_result : 내 MySQL은 (내가) -version이 5.6.33 것 같다 있지만) (get_result (나는 $connection->server_info
를 통해 그것을 echo'd) 다음과 같은 오류 메시지가 생성됩니다
치명적인 오류 X 줄의 X (라인 get_result
)
보호하려는 데이터베이스 열에 대해 UNIQUE 제약 조건은 어떻습니까? –
@Kevin_Kinsey 왜 num_rows가 작동하지 않는 걸까요? 향후 프로젝트에서 매개 변수화 된 mysqli 문과 쿼리를 사용하여 num_rows 및 affected_rows를 가져 오는 방법을 알고 있으면 유용합니다. 그래도 제안을 주셔서 감사합니다! – SearchingSolutions
'fetch()'대신'execute()'를 시도하십시오. – Machavity