0

2000 のクライアント レコードをループ処理し、それらを別のデータベースにコピーするスクリプトがあります。完全に実行される場合もあれば、PHP で送信されたクエリに対応しないメッセージを含む mysql エラーが返される場合もあります。エラーメッセージは次のとおりです ( PA K'2012-12-04 11:05:09' ) O DU LIC TE EY UPDA ):

    [0] => 配列
        (`ここにコードを入力`
        [レベル] => エラー
        [コード] => 1064
        [メッセージ] => SQL 構文にエラーがあります。「PA K'2012-12-04 11:05:09」付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。
        )
            O DU LIC TE EY UPDA' 45 行目
        )

エラーが発生したときに PHP で出力されたクエリ:

    に挿入
                「クライアント」
            (
                `klantId`、
                「なーむ」、
                `アドレス`、
                `郵便番号`、
                「プラッツ」、
                「テレフーン」、
                「モービル」、
                「ファックス」、
                「メール」、
                `ウェブサイト`、
                `post_address`、
                `post_postcode`、
                `post_plaats`、
                `kvknummer`、
                `btwnummer`、
                `rekeningnr`、
                `postbanknr`,
                「メーリング」、
                「作成された」、
                「変更された」
            )値
            (
                1134年、
                「ナーム」、
                'アドレス 9L',
                '1234SG',
                「プラッツ」、
                ヌル、
                ヌル、
                ヌル、
                ヌル、
                'www.test.nl',
                ヌル、
                ヌル、
                ヌル、
                ヌル、
                ヌル、
                ヌル、
                ヌル、
                1、
                '2012-12-04 11:05:09',
                「2012-12-04 11:05:09」
            )
            重複キーの更新について
                `naam`=VALUES(`naam`),
                `アドレス`=VALUES(`アドレス`),
                `郵便番号`=VALUES(`郵便番号`),
                `plaats`=VALUES(`plaats`),
                `テレフーン`=VALUES(`テレフーン`),
                `mobiel`=VALUES(`mobiel`),
                `fax`=VALUES(`fax`),
                `email`=VALUES(`email`),
                `website`=VALUES(`website`),
                `post_adres`=VALUES(`post_adres`),
                `post_postcode`=VALUES(`post_postcode`),
                `post_plaats`=VALUES(`post_plaats`),
                `kvknummer`=VALUES(`kvknummer`),
                `btwnummer`=VALUES(`btwnummer`),
                `rekeningnr`=VALUES(`rekeningnr`),
                `postbanknr`=VALUES(`postbanknr`),
                `mailing`=VALUES(`mailing`),
                `created`=VALUES(`created`),
                `modified`=VALUES(`modified`)
                ;

私のスクリプトは会社でインターンを実行しており、データベースはデータセンターで extern を実行しています。スクリプトは 50% 正しく実行され、50% はエラーで実行されます...

前もって感謝します!!

ループ付きの追加スクリプト:

`
    $dbcon = getDbConnection();
    $aClients = getClients(); // オブジェクトを返す
    foreach ($aClients AS $oClient) {
    $sQuery = ' INSERT INTO
        「クライアント」
    (
        `klantId`、
        「なーむ」、
        `アドレス`、
        `郵便番号`、
        「プラッツ」、
        「テレフーン」、
        「モービル」、
        「ファックス」、
        「メール」、
        `ウェブサイト`、
        `post_address`、
        `post_postcode`、
        `post_plaats`、
        `kvknummer`、
        `btwnummer`、
        `rekeningnr`、
        `postbanknr`,
        「メーリング」、
        「作成された」、
        「変更された」
    )値
    (
        ' . $dbcon->real_escape_string($oClient->id) . '、
        ' . $dbcon->real_escape_string($oClient->naam) . '、
        ' . $dbcon->real_escape_string($oClient->adres) . '、
        ' . $dbcon->real_escape_string($oClient->postcode) . '、
        ' . $dbcon->real_escape_string($oClient->plaats) . '、
        ' . $dbcon->real_escape_string($oClient->telefoonnummer) . '、
        ' . $dbcon->real_escape_string($oClient->mobielnummer) . '、
        ' . $dbcon->real_escape_string($oClient->faxnummer) . '、
        ' . $dbcon->real_escape_string($oClient->emailaddress) . '、
        ' . $dbcon->real_escape_string($oClient->website) . '、
        ' . $dbcon->real_escape_string($oClient->afwijkend_adres) . '、
        ' . $dbcon->real_escape_string($oClient->afwijkend_postcode) . '、
        ' . $dbcon->real_escape_string($oClient->afwijkend_plaats) . '、
        ' . $dbcon->real_escape_string($oClient->kvknummer) . '、
        ' . $dbcon->real_escape_string($oClient->btwnummer) . '、
        ' . $dbcon->real_escape_string($oClient->bankrekening) . '、
        ' . $dbcon->real_escape_string($oClient->postbank) . '、
        ' . $dbcon->real_escape_string($oClient->mailing == 'ja' ? 1 : 0) . '、
        ' . $dbcon->real_escape_string($oClient->created) . '、
        ' . $dbcon->real_escape_string($oClient->modified) . '
    )
    重複キーの更新について
        `naam`=VALUES(`naam`),
        `アドレス`=VALUES(`アドレス`),
        `郵便番号`=VALUES(`郵便番号`),
        `plaats`=VALUES(`plaats`),
        `テレフーン`=VALUES(`テレフーン`),
        `mobiel`=VALUES(`mobiel`),
        `fax`=VALUES(`fax`),
        `email`=VALUES(`email`),
        `website`=VALUES(`website`),
        `post_adres`=VALUES(`post_adres`),
        `post_postcode`=VALUES(`post_postcode`),
        `post_plaats`=VALUES(`post_plaats`),
        `kvknummer`=VALUES(`kvknummer`),
        `btwnummer`=VALUES(`btwnummer`),
        `rekeningnr`=VALUES(`rekeningnr`),
        `postbanknr`=VALUES(`postbanknr`),
        `mailing`=VALUES(`mailing`),
        `created`=VALUES(`created`),
        `modified`=VALUES(`modified`)
    ;';
    $dbcon->query($sQuery);
}`

最終編集: データベース サーバーと同じサーバーでスクリプトを試しましたが、実行されません。それは一線を越えたどこかで起こります...

設定は次のとおりです。スクリプトはサーバー A で実行され、データベースはサーバー B で実行されます。同じネットワークではないため、データベース接続にはインターネットが使用されます。どこかのデータが失われます...

4

1 に答える 1

0

あなたは入力をうまくサニタイズしません。PHPの場合、mysql_real_escape_string()を使用してすべての値を有効にする必要があります

'PA K'2012-12-04 11:05:09'は、多くの人に'を持っているように見えますが、エラーが発生します。これを\'でエスケープします

クエリは機能しますが、機能しません。優れたコーディングで50-50の変更はありません。したがって、クエリが機能する場合は、入力に問題があります。

于 2012-12-05T14:25:14.677 に答える