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
'programing' 카테고리의 다른 글
가상 환경에 설치할 mysql-connector-python을 가져올 수 없습니다. (0) | 2023.09.01 |
---|---|
리터럴 값을 가진 함수에 의한 SQL 순서 (0) | 2023.08.27 |
백분율 높이 HTML 5/CSS (0) | 2023.08.27 |
어떤 테이블이 특정 외래 키 값을 사용하는지 어떻게 알 수 있습니까? (0) | 2023.08.27 |
VBA - XMLHTTP 및 WinHttp 요청 속도 (0) | 2023.08.27 |