1

私はそのようなクエリを持っています:

$sql = "UPDATE test_accs SET 
    acc_owner = '$owner_id', 
    acc_policy_version = '$version', 
    acc_policy_last_update = '$approved', 
    acc_policy_next_update = '$renewed' 
        WHERE acc_id = '1'";

現在、Web形式上のこれらの値はすべてオプションであり、これらの値の1つ、2つなどを設定できます。フォームを送信すると、次のようなクエリになります。

UPDATE test_accs SET acc_owner = '2', acc_policy_version = '1.2', acc_policy_last_update = '2012-12-19', acc_policy_next_update = '2012-12-18' WHERE acc_id = '1'

フォームからすべての値を送信した場合にのみ機能します。すべての値が送信されていない場合でも、たとえば1つの値だけが送信された場合でも、どのように機能するかを教えてください。

1つの値(ポリシーバージョンなど)を設定すると、次のようになります。

UPDATE test_accs SET acc_owner = '', acc_policy_version = '1.2', acc_policy_last_update = '', acc_policy_next_update = '' WHERE acc_id = '1'

そしてそれは機能していません。

acc_ownerテーブルの値が原因である可能性がありますか?

#1366 - Incorrect integer value: '' for column 'acc_owner' at row 1

アドバイスありがとうございます。

形:

echo '<td>Change owner: <select name="owner_id" onchange="showUser(this.value)" style="font-size:9px"><option value="">Select a person:</option>';
    while($owners = mysql_fetch_array($owners_query)) { echo '<option value="'.$owners['id'].'">'.$owners['surname'].' '.$owners['name'].'</option></h2>'; } echo '</select></td>';
    echo "<td><input name='version' style='width:50px;text-align:center' placeholder='0.0' /></td>";
    echo "<td><input name='approved' class='datepicker_all' readonly='readonly' style='text-align:center' placeholder='1999-01-01' /></td>";
    echo "<td><input name='renewed' class='datepicker_all' readonly='readonly' style='text-align:center' placeholder='1999-01-01' /></td>";
4

6 に答える 6

6

これを実現する1つの方法は、SQLステートメントで、指定された値が空の文字列であるかどうかをテストする式を使用することです。指定された値が空の文字列の場合は、列の現在の値を列に割り当てる値として使用します。それ以外の場合は、指定された値を列に割り当てます。

以下の例では、指定された各値は、ステートメントにTWICEを含める必要があります。条件付きテストで1回、条件付きテストの可能な結果としてもう一度。

この文:

UPDATE test_accs
   SET acc_owner              = IF('2'='',acc_owner,'2')
     , acc_policy_version     = IF('1.2'='',acc_policy_version,'1.2')
     , acc_policy_last_update = IF('2012-12-19'='',acc_policy_last_update,'2012-12-19')
     , acc_policy_next_update = IF('2012-12-18'='',acc_policy_next_update,'2012-12-18')
 WHERE acc_id = '1'

は、4つの列すべての値を新しく指定された値に設定するという点で、質問の最初のUPDATEステートメントと同等です。

この文:

UPDATE test_accs
   SET acc_owner              = IF(''='',acc_owner,'')
     , acc_policy_version     = IF('1.2'='',acc_policy_version,'1.2')
     , acc_policy_last_update = IF(''='',acc_policy_last_update,'')
     , acc_policy_next_update = IF(''='',acc_policy_next_update,'')
 WHERE acc_id = '1'

列の値のみを変更しacc_policy_version、他の3つの列の値は変更されません。

これは必ずしも最良のアプローチではありませんが、一部のシナリオでは実行可能です。

指定された各値をステートメントで一度に指定する必要がある式を作成することもできますが、これらの式は少し直感的ではないと思います。

   SET acc_owner          = COALESCE(NULLIF( ''     ,''),acc_owner         )
     , acc_policy_version = COALESCE(NULLIF( '1.2'  ,''),acc_policy_version)

これは基本的に上記の例と同じことをしています。

指定された値が''に等しい場合(acc_owner上記の例の場合のように)、NULLIF式はNULLを返します。COALESCE関数を使用すると、基本的にそのNULL値がスキップされ、列の現在の値は変更されません(列の現在の値が列に割り当てられます)。

指定された値が''と等しくない場合(acc_policy_version上記の例の場合のように)、NULLIF式は指定された値を返します。COALESCE関数はその値を取得し、それを列に割り当てます。

于 2012-12-12T17:14:57.127 に答える
1

空かどうかacc_ownerを確認し、ゼロに設定することは1つのオプションです。列が整数を保持することになっている場合は、空のスペースを挿入できません。または、int値がない限り更新しないでください。

1:

if(strlen($acc_owner)==0){
  $acc_owner=0;

}

2:

 if(is_int($acc_owner)){
  //update it
  }
于 2012-12-12T16:58:23.800 に答える
1

整数フィールドの値は必須ですか?そうでない場合は、GET / POST値が設定されていることを確認し、値が空の場合は、それをupdateステートメントに含めないでください。

if(isset($_GET['acc_id'])) {
    $acc_id = $_GET['acc_id'];
    $sql = "UPDATE test_accs SET ";

    if(isset($_GET['version'])) {
       $version = $_GET['version'];
       $sql = $sql . "acc_policy_version = " . $version . ",";
    }

    if(isset($_GET['owner_id'])) {
       $owner_id = $_GET['owner_id'];
       $sql = $sql . "acc_owner = " . $owner_id . ",";
    }

    $sql = $sql .
        "acc_policy_last_update = '$approved', 
        acc_policy_next_update = '$renewed' 
        WHERE acc_id = " . $acc_id;

    //Execute SQL
    echo "successfully updated " . $acc_id;
} else { 
    echo "invalid acc_id"; 
}
于 2012-12-12T17:04:58.173 に答える
0

htmlフォームから取得したすべての値を確認する必要があります。それよりも、mysqlフィールドがNULLになる可能性がある場合は、phpvarにNULLを設定するだけです。

if (strlen($owner_id) == 0) {
    $owner_id = NULL;
    // OR 
    $owner_id = 0;
} else {
    $owner_id = addslashes($owner_id);
}

$sql = "UPDATE test_accs SET 
    acc_owner = '$owner_id', 
    acc_policy_version = '$version', 
    acc_policy_last_update = '$approved', 
    acc_policy_next_update = '$renewed' 
        WHERE acc_id = '1'";
于 2012-12-12T17:02:22.950 に答える
0

1-$owner_idをint型に変換します

$owner_id = (int)$owner_id;

2-値が0より大きい場合にのみ、条件を使用してこのフィールドを更新します

$sql = "UPDATE test_accs SET " . 
        ($owner_id > 0 ? "acc_owner = '$owner_id', " : "") .
        "acc_policy_version = '$version', " .
        "acc_policy_last_update = '$approved', " . 
        "acc_policy_next_update = '$renewed' " .
        "WHERE acc_id = '1'";

注:気を付けてください。変数が正しくセキュリティで保護されていないようで、mysqlインジェクションのリスクがあります。http://php.net/manual/fr/mysqli.real-escape-string.phpを参照してください。

そして、多分あなたはあなたのmysql開発または任意のormのためにPDO php拡張機能(http://fr2.php.net/manual/en/intro.pdo.php)を使用することを考えるべきですか?

于 2012-12-12T17:19:55.360 に答える
0

オプションフィールドの値を保持する変数を、それぞれのデータ型に応じたデフォルト値で初期化できます。

下記のコードスニペットを参照してください。

      $owner_id=0;
      $version=0;
      $approved='';
      $renewed='';

     if($_SERVER['REQUEST_METHOD']=='POST')
     {
          extract($_POST);
      }

             $sql = "UPDATE test_accs SET 
acc_owner = '$owner_id', 
acc_policy_version = '$version', 
acc_policy_last_update = '$approved', 
acc_policy_next_update = '$renewed' 
    WHERE acc_id = '1'";
于 2012-12-12T17:25:34.230 に答える