중첩된 JSON 배열을 사용하여 중복 키 업데이트 시 PHP/MariaDB
그래서 이거 재밌어요.얼마 전에 이 고객을 위해 만든 맞춤형 재고 관리 소프트웨어에 타사 POS를 통합하고 있습니다.제 시스템은 기본 PHP/HTML/JS 배경입니다.타사 시스템에서 제품 정보와 재고 세부 정보에 대한 JSON 정보를 전송하는 웹 훅이 있습니다.제가 가지고 있는 문제는 타사 시스템에서 제품을 업데이트할 때 중복 키에 업데이트하도록 준비된 INSERT 문을 설정해야 한다는 것입니다.확인해야 할 KEY는 데이터베이스의 세 번째 열이며, 표에서 유일한 고유 키입니다.기본 키는 타사 시스템에서 제공하지 않는 다른 ID입니다.아무리 해도 중복 키 업데이트 기능을 "구축"할 수 없을 것 같습니다.
다음은 이해하기 위한 몇 가지 코드입니다. 제품 정보는 연결되어 제공됩니다.다음을 포함하는 php:
HOOK.php
<?php
header('Content-Type: application/json');
$request3 = file_get_contents('php://input');
req_dump1 = print_r( $request3, true );
fp = file_put_contents( 'req.json', $req_dump1 );
?>
이를 통해 다음과 같은 JSON을 얻을 수 있습니다.
{
"Id": 8919892,
"Name": "Final",
"Description": "Final",
"CostPrice": 0.95000,
"SalePrice": 756.00000,
"CategoryId": 278333,
"Barcode": "2020202020",
"BrandId": 151102,
"SupplierId": 44815,
"OrderCode": "LKJ-8376594",
"ProductType": 0,
"TareWeight": null,
"ArticleCode": "44-jhaqerkhu",
"Supplier": {
"Id": 44815,
"Name": "House",
"Description": "House",
},
}
그러면 나머지 주식 정보는 Hook4에 해당하는 Stock Detail(제3자가 IDK를 분리한 이유, 제가 구축하지 않은 이유)에서 나옵니다.php:
<?php
header('Content-Type: application/json');
$request = file_get_contents('php://input');
$request1=str_replace('[', '', $request);
$request2=str_replace(']', '', $request1);
$req_dump = print_r( $request2, true );
$fp = file_put_contents( 'req4.json', $req_dump );
include('ai.php');
?>
이것은 나에게 다음과 같은 JSON을 줍니다.
REQ4.json
{
"Id": 2553369,
"ProductId": 8919892,
"MinStock": 300,
"ProductStockBatches": {
"Id": 3656516,
"StockId": 2553369,
"CreatedDate": "2021-08-08T03:41:24.153",
"CurrentStock": 225,
"CurrentVolume": 0,
"CostPrice": 0.95000,
}
}
그래서 그 모든 것은 괜찮고 댄디하며, 문제는 ai.php에 있습니다.
<?php
$servername = "localhost";
$username = "terblah";
$password = "blah";
$dbname = "blah";
try
{
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("INSERT INTO blah (name, prod_id, cost, price, brand, vendor_sku, upc, code, on_hand, par, upd_date) VALUES (:name, :prod_id, :cost, :price, :brand, :vendor_sku, :upc, :code, :currentstock, :parstock, :upd_date) ON DUPLICATE KEY UPDATE prod_id = :prod_id");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':prod_id', $prod_id);
$stmt->bindParam(':cost', $cost);
$stmt->bindParam(':price', $price);
$stmt->bindParam(':brand', $brand);
$stmt->bindParam(':vendor_sku', $ven_sku);
$stmt->bindParam(':upc', $upc);
$stmt->bindParam(':code', $code);
$stmt->bindParam(':currentstock', $on_hand);
$stmt->bindParam(':parstock', $par);
$stmt->bindParam(':upd_date', $upd);
$js = file_get_contents('req.json');
$js0 = file_get_contents('req4.json');
$dt = json_decode($js, true);
$dt0 = json_decode($js0, true);
$name = $dt['Name'];
$prod_id = $dt0['ProductId'];
$cost = $dt['CostPrice'];
$price = $dt['SalePrice'];
$brand = $dt['Supplier']['Name'];
$ven_sku = $dt['OrderCode'];
$code = $dt['ArticleCode'];
$upc = $dt['Barcode'];
$on_hand = $dt0['ProductStockBatches']['CurrentStock'];
$par = $dt0['MinStock'];
$upd = $dt0['ProductStockBatches']['CreatedDate'];
$stmt->execute();
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
문제는prod_id = :prod_id
.
라고 정의할 수 없습니다.$prod_id
저는 그런 식으로 다음을 얻습니다.
Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
그대로 놔두면 다음과 같은 것을 알 수 있습니다.
Error: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'prod_id' cannot be null
제가 이해하는 것은 아직 정의되지 않은 변수를 검색해 달라는 것이기 때문입니다.정의를 이동할 때 준비할 문이 아직 호출되지 않았기 때문에 바인딩 오류가 발생합니다. 하지만 정의된 키가 먼저 필요합니다. 그래서 제가 어디선가 속임수를 놓치고 있는 것은 아닌지 궁금합니다.
아직 시도해보지는 않았지만 우선 중복 키 상황에서 검색할 변수를 정의하기 위해 ai.php에서 req4.json을 2x로 호출할 생각을 했습니다.하지만 SQL 문 중간에 있는 '$' 변수를 어떻게 부르나요?정의된 변수를 호출하는 방법은 알고 있지만 JSON에서 해당 정의를 가져온 다음 SQL 문에서 변수로 사용하려면 어떻게 해야 합니까?
내가 할 수 있을까
$ts = file_get_contents('req4.json');
$js1 = json_decode($ts, true);
$var = $js1['ProductId'];
복제 키 업데이트 시
ON DUPLICATE KEY UPDATE (prod_id = ?)
그리고 마지막에
$stmt->execute($var);
시도해봤는데, 제가.
Error: SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters
그럼 여기로 가겠네요.제가 이 질문을 제대로 하고 있는 건가요?현재 작동하지 않는 뇌를 가진 사람이 저를 좀 도와주실 수 있나요?
의 다른 모든 열에 할당해야 합니다.ON DUPLICATE KEY UPDATE
.prod_id
열은 중복 항목을 검사하는 열입니다.
사용할 수 있습니다.VALUES(colname)
삽입되었을 값을 얻을 수 있습니다.
$stmt = $conn->prepare("
INSERT INTO blah (name, prod_id, cost, price, brand, vendor_sku, upc, code, on_hand, par, upd_date)
VALUES (:name, :prod_id, :cost, :price, :brand, :vendor_sku, :upc, :code, :currentstock, :parstock, :upd_date)
ON DUPLICATE KEY UPDATE
name = VALUES(name), cost = VALUES(cost), price = VALUES(price), brand = VALUES(brand), vendor = VALUES(vendor)_sku = VALUES(sku), upc = VALUES(upc), code = VALUES(code), on = VALUES(on)_hand = VALUES(hand), par = VALUES(par), upd = VALUES(upd)_date = VALUES(date)");
언급URL : https://stackoverflow.com/questions/68718198/php-mariadb-on-duplicate-key-update-with-nested-json-array
'programing' 카테고리의 다른 글
오라클 sysdba 암호 복구 또는 변경 방법 (0) | 2023.08.17 |
---|---|
가로 세로 비율을 유지하면서 비례적으로 이미지 크기를 조정하는 방법은 무엇입니까? (0) | 2023.08.12 |
머리글 및 행 목록을 팬더 데이터 프레임으로 변환 (0) | 2023.08.12 |
Javascript로 FB 사진 태그를 프로그래밍 방식으로 해제합니다. (0) | 2023.08.12 |
조각 간의 전환을 애니메이션화합니다. (0) | 2023.08.12 |