문제

저는 JobName 열을 UNIQUE로 정의하는 MySQL 테이블을 다루고 있습니다.누군가 데이터베이스에 이미 있는 JobName을 사용하여 데이터베이스에 새 작업을 저장하려고 하면 MySQL에서 경고가 발생합니다.

나는 PHP 스크립트에서 오류처럼 이 경고를 감지하고 적절하게 처리할 수 있기를 원합니다.이상적으로는 코드를 분기하여 처리할 수 있도록 MySQL이 어떤 종류의 경고를 발생시켰는지 알고 싶습니다.

이것이 가능한가?그렇지 않다면 MySQL에 이 기능이 없거나, PHP에 이 기능이 없기 때문입니까, 아니면 둘 다입니까?

도움이 되었습니까?

해결책

PHP에 경고가 기본적으로 "플래그"되려면 mysql/mysqli 드라이버를 변경해야 하는데 이는 분명히 이 질문의 범위를 벗어납니다.대신 기본적으로 데이터베이스에 대한 모든 쿼리에서 경고를 확인해야 합니다.

$warningCountResult = mysql_query("SELECT @@warning_count");
if ($warningCountResult) {
    $warningCount = mysql_fetch_row($warningCountResult );
    if ($warningCount[0] > 0) {
        //Have warnings
        $warningDetailResult = mysql_query("SHOW WARNINGS");
        if ($warningDetailResult ) {
            while ($warning = mysql_fetch_assoc(warningDetailResult) {
                //Process it
            }
        }
    }//Else no warnings
}

분명히 이것은 대량으로 적용하는 데 엄청나게 많은 비용이 들기 때문에 언제, 어떻게 경고가 발생할 수 있는지 신중하게 생각해야 할 수도 있습니다(이로 인해 경고를 제거하기 위해 리팩토링해야 할 수도 있음).

참고로, MySQL 쇼 경고

물론 초기 쿼리를 생략할 수도 있습니다. SELECT @@warning_count, 실행당 쿼리를 절약할 수 있지만 현학적 완전성을 위해 포함했습니다.

다른 팁

먼저, 당신은 경고 꺼 줘 방문자가 귀하의 광고를 볼 수 없도록 MySQL 오류.둘째, 전화할 때 mysql_query(), false를 반환했는지 확인해야 합니다.그랬다면 전화해 mysql_errno() 무엇이 잘못되었는지 알아보기 위해.의 오류 코드에 반환된 번호를 일치시키세요. 이 페이지.

찾고 있는 오류 번호는 다음과 같습니다.

오류:1169 SQL상태:23000 (ER_DUP_UNIQUE)

메시지:고유 제약 조건으로 인해 '%s' 테이블에 쓸 수 없습니다.

ini_set('mysql.trace_mode', 1)

당신이 찾고있는 것일 수도 있습니다.

그런 다음 PHP 오류는 사용자 정의 PHP 오류 처리기를 사용하여 처리할 수 있지만 일반적으로 로그 파일에 기록되므로 PHP 오류 표시를 끌 수도 있습니다(PHP 구성에 따라 다름).

사용 중인 프레임워크(있는 경우)에 따라 작업 이름을 직접 확인하고 양식에 대한 나머지 유효성 검사를 통해 사용자에게 적절한 정보를 생성하는 쿼리를 수행하는 것이 좋습니다.

작업 이름 수에 따라 양식이 포함된 보기에 이름을 보내고 자바스크립트를 사용하여 어떤 작업이 사용되는지 알릴 수 있습니다.

이것이 이해가 되지 않는다면 내 견해를 요약하면 다음과 같습니다.프로그램 및/또는 사용자가 불법적인 일을 하려고 시도하도록 설계하지 말고, 그들이 할 때 오류를 잡아서 처리하십시오.오류가 발생하지 않도록 시스템을 설계하는 것이 훨씬 좋습니다.실제 버그에 대한 오류를 유지하십시오 :)

귀하의 상황에 적용되지 않는 errno 기능에 대한 내용을 제거하도록 업데이트되었습니다.

MySQL에서 주의해야 할 한 가지 UPDATE 진술: mysqli_affected_rows() 경우에도 0을 반환합니다. WHERE 절이 행과 일치했지만 SET 절은 실제로 데이터 값을 변경하지 않았습니다.내가 이것을 언급한 이유는 그 동작이 내가 한 번 본 시스템에 버그를 일으켰기 때문입니다. 프로그래머는 업데이트 후 오류를 확인하기 위해 해당 반환 값을 사용했으며, 0은 일부 오류가 발생했음을 의미한다고 가정했습니다.이는 사용자가 업데이트 버튼을 클릭하기 전에 기존 값을 변경하지 않았다는 의미일 뿐입니다.

그래서 나는 사용하는 것 같아요 mysqli_affected_rows() 다음과 같은 것이 없으면 그러한 경고를 찾을 수 없습니다. update_time 업데이트될 때 항상 새로운 타임스탬프 값이 할당되는 테이블의 열입니다.하지만 그런 종류의 해결 방법은 다소 복잡해 보입니다.

mysqli 문 오류 번호를 사용하여 고유 키 위반을 감지할 수 있습니다.mysqli 문은 오류 1062, 즉 ER_DUP_ENTRY를 반환합니다.오류 1062를 찾아 적절한 오류 메시지를 인쇄할 수 있습니다.오류 메시지의 일부로 열(jobName)도 인쇄하려면 명령문 오류 문자열을 구문 분석해야 합니다.

  if($stmt = $mysqli->prepare($sql)){
            $stmt->bind_param("sss",
            $name,
            $identKey,
            $domain);


            $stmt->execute();
            if($mysqli->affected_rows != 1)  {
                        //This will return errorno 1062
                trigger_error('mysql error >> '.$stmt->errno .'::' .$stmt->error, E_USER_ERROR);
                exit(1);
            }
            $stmt->close();
        } else {

            trigger_error('mysql error >> '. $mysqli->errno.'::'.$mysqli->error,E_USER_ERROR);
        }

mysql보다 mysqli를 사용하면 더 효율적인 방법으로 경고를 받을 수 있습니다.

매뉴얼에 제안된 코드는 다음과 같습니다. 페이지 php.net에서 mysqli->warning_count 속성에 대해:

$mysqli->query($query);

if ($mysqli->warning_count) {
    if ($result = $mysqli->query("SHOW WARNINGS")) {
        $row = $result->fetch_row();
        printf("%s (%d): %s\n", $row[0], $row[1], $row[2]);
        $result->close();
    }
}

경고 억제에 대한 참고 사항:일반적으로 중요한 내용이 누락될 수 있으므로 경고가 표시되지 않도록 하는 것은 좋은 생각이 아닙니다.어떤 이유로든 경고를 반드시 숨겨야 하는 경우에는 다음을 배치하여 개별적으로 숨길 수 있습니다. @ 성명서 앞에 서명하십시오.이렇게 하면 모든 경고 보고를 해제할 필요가 없으며 특정 인스턴스로 제한할 수 있습니다.

예:

 // this suppresses warnings that might result if there is no field titled "field" in the result
 $field_value = @mysql_result($result, 0, "field");
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top