2017-05-23 14 views
0

一部の入力とともにデータベースに画像を保存しようとしましたが、このメッセージ 'SQLSTATE [23000]:Integrity constraint violation :1048列 'image_url'をnullにすることはできません。ここでSQLSTATE [23000]:整合性制約違反:1048カラム 'image_url'をnullにすることはできません

ソースコードである:入力を処理するための

PHPコード:

<?php 
if($_POST){ 

     //$ef = $_POST["exp_file"]; 
     if($_POST["heading"] == '' && $_POST["myimage"] =='' && $_POST["text"] =='') 
     { 
      echo '<div style="padding:7px; margin-top:5px; margin-bottom:5px;" id="good" class="alert-warning">Check inputs for empty values.</div>'; 
     }else{ 

       try { 


     $head = $mysqli->real_escape_string($_POST["heading"]); 
     $txt = $mysqli->real_escape_string($_POST["text"]); 
     $time = time(); 
     $upload_image=$_FILES["myimage"]["name"]; 

     $folder="uploads/"; 

     move_uploaded_file($_FILES["myimage"]["tmp_name"], "$folder".$_FILES["myimage"]["name"]); 


      $stmt = $db->prepare("insert into posts(

      heading, 
      post_desc, 
      image_url, 
     user, 
     post_date 
     ) VALUES(:head,:pd,:iu,:user,:dat)"); 
     $stmt->execute(array(
     ':head'=>$head, 
     ':pd'=>$txt, 
     ':iu'=>$upload_image, 
     ':user'=>$user, 
     ':dat'=>$time 


     )); 
       //Saved 
       echo '<div style="padding:7px; margin-top:5px; margin-bottom:5px;" id="good" class="alert-success">Published Successfully.</div>'; 
       //$_POST = array(); 
      } catch(PDOException $e) { 
       echo $e->getMessage(); 
      } 

      } 
     } 
?> 

jQueryのそれの一部:

<script> 
/* must apply only after HTML has loaded */ 
$(document).ready(function() { 
    $("#contact_form").on("submit", function(e) { 
     var postData = $(this).serializeArray(); 
     var formURL = $(this).attr("action"); 
     $.ajax({ 
      url: formURL, 
      type: "POST", 
      data: postData, 
      success: function(data, textStatus, jqXHR) { 
       $('#contact_dialog .modal-header .modal-title').html("Result"); 
       $('#contact_dialog .modal-body').html(data); 
       $("#submitForm").remove(); 
      }, 
      error: function(jqXHR, status, error) { 
       console.log(status + ": " + error); 
      } 
     }); 
     e.preventDefault(); 
    }); 

    $("#submitForm").on('click', function() { 
     $("#contact_form").submit(); 
    }); 
}); 
</script> 

最後に、HTML

<div class="modal fade" id="contact_dialog" role="dialog"> 
    <div class="modal-dialog"> 
     <div class="modal-content"> 
      <div class="modal-header"> 
       <button type="button" class="close" data-dismiss="modal">&times;</button> 
       <h4 class="modal-title"><span class="glyphicon glyphicon-file"></span> Create an Article</h4> 
      </div> 
       <div class="modal-body"> 
       <form id="contact_form" class="form col-md-12 center-block form-signin" action="article/publish.php" method="post" autocomplete="off" enctype="multipart/form-data"> 

        <div class="row">  
         <div class="col-lg-12"> 
          <div class="form-group"> 
          <input type="text" class="form-control input-lg" placeholder="Heading" name="heading" id="heading" value="">        
          </div> 
         </div> 
        </div> 

              <div class="row">  
         <div class="col-lg-12"> 
          <div class="form-group"> 
          <input type="file" class="form-control file_image" placeholder="Upload a file" name="myimage" id="files" value="">        
          </div> 
         </div> 
        </div> 


         <div class="row">  
         <div class="col-lg-12"> 
          <div class="form-group"> 
          <textarea class="form-control input-lg textarea" name="text" id="text" cols="120" rows="9" wrap="virtual"></textarea> 
          </div> 
         </div> 
        </div> 


        </form> 

       </div> 
       <div class="modal-footer"> 
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 
        <button type="button" id="submitForm" class="btn btn-default">Publish</button> 
       </div> 
      </div> 
     </div> 
    </div> 

エラーまたは平均?そして私は間違って何をしているのですか?

答えて

0

...しかし、あなたがしているようですimage_urlの値としてNULLを永久に挿入しようとしました。

まず、NULL値をデータベースに受け入れるかどうかを決定する必要があります。データベースに対応するフィールドを定義します(NOT NULLフィールド)。あまりにとOR演算子を使用 - - だけではなく、空の値(... == '')に -

第二に、あなたはNULL値を検証する必要がありますように、受信$_POST年代に - 代わりANDのを:

if ($_POST) { 
    if (
      $_POST["heading"] == '' || !isset($_POST["heading"]) || 
      $_POST["myimage"] == '' || !isset($_POST["myimage"]) || 
      $_POST["text"] == '' || !isset($_POST["text"]) 
    ) { 
     echo '...'; 
    } else { 
     //... 
    } 
} 

第三に、有効なフォーム値を実際に送信するようにします。空ではなく、等しくないNULL

また、SQL文を準備するときにbindValue()またはbindParam()を使用することをお勧めします。これにより、データ型ごとに各バインディングパラメータを検証できます。挿入する値のデータ型は、データベース内の対応するフィールドに定義されているデータ型に対応する必要があるため、これは重要なステップです。 Like:

$sql = 'insert into posts(heading, post_desc, image_url, user, post_date) VALUES(:head, :pd, :iu, :user, :dat)'; 
$stmt = $db->prepare($sql); 
$stmt->bindValue(':head', $head, getInputParameterDataType($head)); 
$stmt->bindValue(':pd', $txt, getInputParameterDataType($txt)); 
$stmt->bindValue(':iu', $upload_image, getInputParameterDataType($upload_image)); 
//... 
$stmt->execute(); 

function getInputParameterDataType($value) { 
    $dataType = PDO::PARAM_STR; 
    if (is_int($value)) { 
     $dataType = PDO::PARAM_INT; 
    } elseif (is_bool($value)) { 
     $dataType = PDO::PARAM_BOOL; 
    } 
    return $dataType; 
} 

また、PDOStatement :: prepare()は常に例外を投げるわけではありません。したがって、prepare()がFALSEと別々のケースも処理する必要があります。 execute()関数も例外をスローしません。だからprepare()のように扱います。ここに例があります。

try { 
    $connection = getConnection(); 

    $sql = "INSERT INTO..."; 
    $statement = $connection->prepare($sql); 

    if (!$statement) { 
     throw new Exception('The SQL statement can not be prepared!'); 
    } 

    $statement->bindValue(':id', $id, PDO::PARAM_INT); 

    if (!$statement->execute()) { 
     throw new Exception('The PDO statement can not be executed!'); 
    } 

    return $statement->rowCount() > 0 ? TRUE : FALSE; 
} catch (PDOException $pdoException) { 
    echo '<pre>' . print_r($pdoException, true) . '</pre>'; 
    exit(); 
} catch (Exception $exception) { 
    echo '<pre>' . print_r($exception, true) . '</pre>'; 
    exit(); 
} 
+0

ありがとうございました...今すぐコードを変更します。貴重な時間をありがとう。 –

+0

@FagbemiAyodeleよろしくお願いします! –

+0

@FagbemiAyodele(php)アプリケーションでの例外処理のワークフロー(例外の定義、再利用、例外のコーディング、例外の順序付けなど)について、私は以前から答えを書いていました。それは大きいです:-))しかし、簡単に従う。私は特にPDO例外処理を示しました。興味のある方は:[PDO :: prepare()とPDOStatement :: execute()+例外処理の一般化についての例外処理](https://stackoverflow.com/questions/43691356/cant-update-or- delete-dynamically-with-twig-and-php-oop/43704962#43704962) –

0

あなたはajaxでmultipart/form-dataを送信しています。そのため、あなたのスクリプトで$_FILES真実が利用可能ではなく、nullデータを$upload_imageに設定するのはそのためです。 move_uploaded_file()がサーバーにファイルをアップロードしない可能性もあります。私はこれをテストしていませんが、あなたはあなたのAJAXコードに以下の変更をテストすることができますが:問題は、すべてのコードをテストすることなく、どこにあるかを正確に伝えるために少し難しい

$.ajax({ 
      url: formURL, 
      type: "POST", 
      data: new FormData(this), 
      processData: false, 
      contentType: false, 
      success: function(data, textStatus, jqXHR) { 
       $('#contact_dialog .modal-header .modal-title').html("Result"); 
       $('#contact_dialog .modal-body').html(data); 
       $("#submitForm").remove(); 
      }, 
      error: function(jqXHR, status, error) { 
       console.log(status + ": " + error); 
      } 
     }); 
+0

ありがとうございました。画像パスがdbに保存されても、ルートフォルダに移動しない理由を教えてください。 –

+0

どうすればいいですか?私は答えを受け入れることを意味しますか? –

関連する問題