>  기사  >  백엔드 개발  >  [PDO 바인딩 매개변수] PHP의 PDO 확장을 사용하여 일괄 업데이트 작업 수행 php pdo sqlite php pdo odbc php open pd

[PDO 바인딩 매개변수] PHP의 PDO 확장을 사용하여 일괄 업데이트 작업 수행 php pdo sqlite php pdo odbc php open pd

WBOY
WBOY원래의
2016-07-29 08:52:301745검색

최근 데이터베이스 테이블의 특정 필드를 일괄 업데이트해야 한다는 요구 사항이 있었습니다. 이 요구 사항을 수행할 때 매개 변수 바인딩에 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 pdo中文手册,php pdo教程,php pdo mysql,php pdo.dll,php pdo mssql.dll,php pdo扩展,php pdo mysql.dll,php pdo.dll下载,php pdo mssql,php pdo类,php pdo mysql类,php pdo fetch,php pdo sqlite,php pdo odbc,php开启pd

설명에 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 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.