programing

mySQL에서 mariaDB 타임스탬프 메시업으로 전환

newstyles 2023. 8. 27. 09:00

mySQL에서 mariaDB 타임스탬프 메시업으로 전환

MySQL에서 MariaDB로 전환하여 "사소한" 문제를 일으켰습니다.한 명이 몇 시간째 날 괴롭히고 있는데 해결책을 찾을 수가 없어요.

MySQL에서 데이터베이스를 내보내고 MariaDB로 가져와서 데이터베이스를 이동했는데 잘 되었습니다.

업데이트 쿼리 중 하나가 작동하지 않을 때 데이터베이스 처리기에서 이 기능으로 범위를 좁혔습니다.

public function updateEquipment($type,$product,$acquisition,$calibration_interval,$equipment_no,$inspection_date,$equipment_id,$active)
    {       
        $stmt = $this->conn->prepare("UPDATE equipment SET type = :type, acquisition = :acquisition, calibration_interval = :calibration_interval, equipment_no = :equipment_no, product = :product, inspection_date = :inspection_date, active = :active WHERE id = :equipment_id");

        $stmt->bindParam(":equipment_id", $equipment_id,PDO::PARAM_INT);
        $stmt->bindParam(":type", $type,PDO::PARAM_STR);
        $stmt->bindParam(":acquisition", $acquisition,PDO::PARAM_STR);
        $stmt->bindParam(":calibration_interval", $calibration_interval,PDO::PARAM_STR);
        $stmt->bindParam(":equipment_no", $equipment_no,PDO::PARAM_STR);
        $stmt->bindParam(":product", $product,PDO::PARAM_STR);
        $stmt->bindParam(":inspection_date", $this->formatDateStrToTimeStamp($inspection_date),PDO::PARAM_STR);
        $stmt->bindParam(":active", $active,PDO::PARAM_INT);
        return $stmt->execute();        
    }

formatDateStrToTimeStamp 함수:

private function formatDateStrToTimeStamp($inspection_date)
    {
        $day = substr($inspection_date,0,2);
        $month = substr($inspection_date,3,2);
        $year = substr($inspection_date,6,4);   
        return date('Y-m-d H:i:s', strtotime($year."-".$month."-".$day));
    }

보시는 바와 같이, 저는 업데이트하고 싶은 타임스탬프를 나타내는 문자열로 myinspection_date의 바인딩을 변경했습니다.타임스탬프를 업데이트하지 않고 문을 테스트했더니 예상대로 작동했습니다.타임스탬프를 추가하는 즉시(정적 타임스탬프를 삽입한 경우) 행이 업데이트되지 않고 실행이 반환되지 않습니다(true 또는 false를 반환해야 함).

내 테이블 구조는 다음과 같습니다.

CREATE TABLE `equipment` (
  `id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `type` text NOT NULL,
  `acquisition` text NOT NULL,
  `calibration_interval` text NOT NULL,
  `equipment_no` text NOT NULL,
  `product` text NOT NULL,
  `inspection_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `active` int(11) NOT NULL DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

질문:mariaDB에서 타임스탬프가 다르게 처리됩니까? 스위치 이후로 코드를 변경하지 않았고 MySQL 데이터베이스에서 만든 내보내기에서 데이터베이스를 가져왔기 때문입니다.

(저는 웹 애플리케이션 디버깅을 잘 못하기 때문에) 바지를 디버깅한 후에 저는 마침내 제 문제에 대한 답을 찾았습니다.

PDO의 bindparam은 변수를 pdo 설명서에도 나와 있는 자리 표시자 또는 물음표에 바인딩해야 합니다.나의 경우 바인딩할 때 직접 문자열을 삽입하려고 시도했고 오류가 있는 원래 코드는 타임스탬프 형식의 반환 값을 사용했습니다.두 경우 모두 내 자리 표시자에 바인딩할 때 변수를 사용하지 않았기 때문에 오류가 발생했습니다.

Chrome의 Advanced Rest Client를 사용하여 함수를 디버깅할 때 "변수만 참조로 전달해야 합니다"라는 오류가 발생했습니다.

솔루션 1:

$inspect = $this->formatDateStrToTimeStamp($inspection_date);
$stmt->bindParam(":inspection_date", $inspect,PDO::PARAM_STR);

솔루션 2:

Ryan Vincent가 코멘트에서 지적했듯이 bindValue를 대신 사용합니다(추가 영감은 그의 코멘트 참조).

하지만 여전히 약간 혼란스럽습니다.하지만 코드가 이전에 다른 호스트에서 문제없이 실행되었기 때문에, 저는 여전히 약간 혼란스럽습니다.저는 PHP 버전이나 그 어떤 것도 기억할 수 없지만, 만약 누군가가 이전 버전에서 그것이 가능하다는 것을 확인할 수 있다면 그것은 왜 그런지 설명할 것입니다.

언급URL : https://stackoverflow.com/questions/33881508/switch-from-mysql-to-mariadb-timestamp-messup