최근 데이터베이스 테이블의 특정 필드를 일괄 업데이트해야 한다는 요구 사항이 있었습니다. 이 요구 사항을 수행할 때 매개 변수 바인딩에 PDO가 사용되었으며 피트가 발생했습니다.
구성표 선택
저자는 일괄 업데이트에 대해 다음과 같은 해결 방법을 알고 있습니다.
1. 하나씩 업데이트합니다.
이것이 가장 간단한 해결 방법이지만 의심할 여지없이 가장 효율적인 솔루션입니다.
2. CASE WHEN
다음
<span>UPDATE</span> tbl_test <span>SET</span> val <span>=</span><span>CASE</span> id <span>WHEN</span><span>1</span><span>THEN</span><span>2</span><span>WHEN</span><span>2</span><span>THEN</span><span>3</span><span>END</span><span>WHERE</span> id <span>IN</span>(<span>1</span>, <span>2</span>);
PDO 바인딩 매개변수
와 유사한 구문 주입에는 PDO 확장 바인딩 매개변수가 사용됩니다. 위의 숫자는 일반적으로 변수이므로 매개변수 바인딩이 필요합니다. 처음에는 IN 중에 id로 구성된 문자열을 변수로 바인딩할까 생각했습니다. 첫 번째 구현 코드는 다음과 같습니다.
<span> 1</span> <?<span>php </span><span> 2</span><span>$data</span> = <span>array</span>(<span>array</span>('id' => 1, 'val' => 2), <span>array</span>('id' => 2, 'val' => 3<span>)); </span><span> 3</span><span>$ids</span> = <span>implode</span>(',', <span>array_map</span>(<span>function</span>(<span>$v</span>) {<span>return</span><span>$v</span>['id'];}, <span>$data</span>)); <span>//</span><span>获取ID数组</span><span> 4</span><span>$update_sql</span> = 'UPDATE tbl_test SET val = CASE id'<span>; </span><span> 5</span><span>$params</span> = <span>array</span><span>(); </span><span> 6</span><span>$params</span>[":ids"] = <span>$ids</span><span>; </span><span> 7</span><span>foreach</span>(<span>$data</span><span>as</span><span>$key</span> => <span>$item</span><span>) { </span><span> 8</span><span>$update_sql</span> .= "WHEN :id_" . <span>$key</span> . "THEN :val_" . <span>$key</span> . " "<span>; </span><span> 9</span><span>$params</span>[":id_" . <span>$key</span>] = <span>$item</span>['id'<span>]; </span><span>10</span><span>$params</span>[":val_" . <span>$key</span>] = <span>$item</span>['val'<span>]; </span><span>11</span><span> } </span><span>12</span><span>$update_sql</span> .= "END WHERE id IN (:_ids)"<span>; </span><span>13</span><span>TEST::</span>execute(<span>$update_sql</span>, <span>$params</span>);//此处会调用bindParam绑定参数
나중에 보니 그렇지 않습니다. , 이상한 점은 첫 번째 레코드만 이런 방식으로 업데이트할 수 있다는 것입니다. 정보를 살펴본 후 이 바인딩 방법은 IN 문의 매개변수를 하나씩 바인딩해야 한다는 것을 알았습니다. 문서에서 BindParam 함수에 대한 설명을 살펴보십시오.
설명에 PHP 변수를 자리 표시자에 바인딩한다고 나와 있는 것을 볼 수 있습니다. 바인딩됨 :id가 1과 2의 문자열인 경우 MySQL은 명령문을 구문 분석할 때 이를 문자열로 처리하는 대신 1과 2를 단일 변수로 구문 분석합니다. 이는 SQL 삽입을 방지하기 위한 PDO의 원칙이기도 합니다. 플레이스홀더 바인딩을 통해 바인딩된 값만 값으로 간주하고 명령문 등의 다른 값은 변수로 간주하지 않습니다. 값.
수정글:
<span> 1</span> <?<span>php </span><span> 2</span><span>$data</span> = <span>array</span>(<span>array</span>('id' => 1, 'val' => 2), <span>array</span>('id' => 2, 'val' => 3<span>)); </span><span> 3</span><span>$update_sql</span> = 'UPDATE tbl_test SET val = CASE id'<span>; </span><span> 4</span><span>$params</span> = <span>array</span><span>(); </span><span> 5</span><span>$params</span>[":ids"] = <span>$ids</span><span>; </span><span> 6</span><span>$in_arr</span> = <span>array</span><span>(); </span><span> 7</span><span> 8</span><span>foreach</span>(<span>$data</span><span>as</span><span>$key</span> => <span>$item</span><span>) { </span><span> 9</span><span>$update_sql</span> .= "WHEN :id_" . <span>$key</span> . "THEN :val_" . <span>$key</span> . " "<span>; </span><span>10</span><span>$params</span>[":id_" . <span>$key</span>] = <span>$item</span>['id'<span>]; </span><span>11</span><span>$params</span>[":val_" . <span>$key</span>] = <span>$item</span>['val'<span>]; </span><span>12</span><span>$params</span>[":ids_" . <span>$key</span>] = <span>$item</span>['id'<span>]; </span><span>13</span><span>array_push</span>(<span>$in_arr</span>, ":id_" . <span>$key</span><span>); </span><span>14</span><span> } </span><span>15</span><span>$update_sql</span> .= "END WHERE id IN (" . <span>implode</span>(',' <span>$in_arr</span>) . ")"<span>; </span><span>16</span> TEST::execute(<span>$update_sql</span>, <span>$params</span>);<span>//</span><span>此处会调用bindParam绑定参数</span>
요약
이건 제가 최근에 접한 작은 문제입니다. 사실, When을 설명하는 것에 더 가깝습니다. MySQL IN 문의 바인딩 매개변수는 하나씩 바인딩해야 합니다.
참조 링크:
mysql 문: 여러 레코드의 서로 다른 값 일괄 업데이트
배열을 IN() 조건에 바인딩할 수 있나요?
이 글은 제한된 문체와 제한된 지식으로 작성한 원본 글입니다. 글에 잘못된 점이 있으면 알려주시기 바랍니다.
이 글이 도움이 되셨다면 추천을 눌러주세요.
위에서는 PHP의 PDO 확장을 사용하여 PHP 및 PDO 콘텐츠를 포함한 일괄 업데이트 작업을 수행하는 [PDO 바인딩 매개 변수]를 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.