2017-02-22 21 views
-2

テーブル内の行を更新するか、存在しない場合はINSERTしますか?REPLACEを使用できないのはなぜですか?テーブルの行を更新するか、存在しない場合はINSERTしますか?

私はすでにこのリンクから解決策を読みました。 How do I UPDATE a row in a table or INSERT it if it doesn't exist?

私は置き換えを使用しましたが、動作しませんでした。テーブルに新しい行が追加されただけですが、何も更新されませんでした。 enter image description here

私は

if(logo or bgBNPage is enpty) 
{ 
insert into database 
} 
else{ 
Update database 
} 

を使用でき、これは enter image description here

<?php 

define('ROOTPATH', __DIR__); 
$output = []; 
$output['result'] = []; 
$output['image_path'] = []; 
$applicationName = (isset($_POST) && array_key_exists('applicationName', $_POST)) ? $_POST['applicationName'] : 'applicationName'; 

if (empty($applicationName)) { 
    $output['result'][] = 'missing application name'; 
} 
else if (is_array($_FILES) && array_key_exists('image', $_FILES) && array_key_exists('logo', $_FILES)) 
{ 

    $upload_dir = '/upload_dir/'; 
    $upload_path = ROOTPATH . $upload_dir; 

    $applicationName = $_POST['applicationName']; 

    $sql_field_list = ['applicationName']; 
    $sql_value_list = [$applicationName]; 

    foreach ($_FILES as $key => $upload) { 

     if($key != 'image' && $key != 'logo') 
     { 
      $output['result'][] = $key . ' is invalid image'; 
     } 
     else 
     { 

      if ($upload['error'] == UPLOAD_ERR_OK && 
       preg_match('#^image\/(png|jpg|jpeg|gif)$#', strtolower($upload['type'])) && //ensure mime-type is image 
       preg_match('#.(png|jpg|jpeg|gif)$#', strtolower($upload['name']))) //ensure name ends in trusted extension 
      { 
       $parts  = explode('/', $upload['tmp_name']); 
       $tmpName = array_pop($parts); 
       $fieldname = ($key == 'image') ? 'bgBNPage' : 'logo'; 
       $filename = $applicationName . '_' . $fieldname . '.' . pathinfo($upload["name"], PATHINFO_EXTENSION); 

       if (move_uploaded_file($upload["tmp_name"], $upload_path . $filename)) 
       { 

        $sql_field_list[] = $fieldname; 
        $sql_value_list[] = $upload_dir . $filename; 

        $output['image_path'][$key] = $upload_dir . $filename; 
       } 
       else 
       { 
        $output['result'][] = $key . ' upload fail'; 
       } 

      } 
      else 
      { 
       $output['result'][] = $key . ' error while upload'; 
      } 
     } 

    } 

    //after upload complete insert pic data into database 

    $con = mysqli_connect("localhost", "root", "root", "museum"); 

    if (!$con) { 
     echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 

    $fields = implode(', ', $sql_field_list); 
    $values = implode("', '", $sql_value_list); 
    $sql = "REPLACE INTO general (" . $fields . ") VALUES ('" . $values . "');"; 

    if (!mysqli_query($con, $sql)) { 
     die('Error: ' . mysqli_error($con)); 
    } 

    mysqli_close($con); 


} else { 

    $output['result'][] = 'no file selected'; 
} 

    header('Content-type: application/json'); 
    echo json_encode($output); 
    echo json_encode('finish'); 

?> 

私の構造である私に正しい構文を教えてください。

+1

「実行していない」実行している実際のSQLクエリとは何ですか?あなたのSQLクエリがあなたが期待していることをしていない場合は、少なくともそのクエリが何であるかを見てください。 – David

+0

$ sql_field_listと$ sql_value_listに主キーを設定する必要があります。そうでない場合、replaceは特定の行を「識別」することができません。あなたはここで説明を見つけるでしょう:http://stackoverflow.com/questions/3003244/does-replace-into-have-a-where-clause – Oliver

答えて

0

私は推測しているのは、重複している場合は更新したいフィールドです。したがって、ユーザー名が一意のキーであれば、次のようなことができます。

insert into general ([fields]) values ([values]) 
on duplicate username update 
[whatever] 
0

解決策が見つかりました。 それ以外の場合は、それをプロービングするために条件を使用します。 これは私のコードの結果です

//after upload complete insert pic data into database 
    $con = mysqli_connect("localhost", "root", "root", "museum"); 
    $sql = "SELECT logo,bgBNPage FROM general "; 
    $result = mysqli_query($con, $sql); 


    if (!$con) { 
     echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 

    $fields = implode(', ', $sql_field_list); 
    $values = implode("', '", $sql_value_list); 

    if(mysqli_num_rows($result) > 0) 
    { 
     $str_array = []; 
     for($i =0; $i < count($sql_field_list); $i++) 
     { 
      $str_array[] = $sql_field_list[$i] . "='" . $sql_value_list[$i] ."'"; 
     } 

     $sql = 'UPDATE general SET ' . implode(',', $str_array); 
     //$sql = "UPDATE general SET (" . $fields . ") = ('" . $values . "');"; 
    } 
    else 
    { 
     $sql = "INSERT INTO general (" . $fields . ") VALUES ('" . $values . "');"; 
    } 


    if (!mysqli_query($con, $sql)) { 
     die('Error: ' . mysqli_error($con)); 
    } 

    mysqli_close($con); 
+0

あなたの解決策は原子的ではありません。レコードが存在しても、 'SELECT'の時刻と' UPDATE'の時刻との間に別の更新または削除が発生した場合はどうなりますか?もう一方の更新を上書きするか、レコードが削除された場合はエラーが発生します。また、クエリを送信する前に接続を確認することもできます。 – alanlittle