2017-09-11 14 views
-2

次のajaxコールを実行しているときに、id removeAttachmentおよびdata属性 "data-recordid"のボタンをクリックすると、スクリプトはそれに応じてPHPスクリプトを実行します。エラーコード500で応答します。これにより、ajax呼び出しが終了しません。PHPのajaxコールが実行されますが、返されます。

JS

$('#removeAttachment').on("click", function(e){ 
    e.preventDefault(); 
    var recordid = $(this).data('recordid'); 
    if(confirm("Weet je zeker dat je deze bijlage wilt verwijderen?")){ 
     $.ajax({ 
      type: 'POST', 
      url: ('/functions/maintenance_functions.php?action=removeAttachment'), 
      data: {recordId: recordid}, 
      cache: false, 
      success: function(data,status) { 
       $('#currentAttachment').hide(); 
       $('#record_table').bootstrapTable('refresh'); 
      } 
     }) 
    } 
}); 

PHP - (!と問題なく動作している)は、PHPスクリプトは他のAjaxのクエリによって呼び出される様々な "行動" が含まれていることに注意してください

if($action=="removeAttachment" && isset($_POST['recordId']) && get_maintequipmentrecord_info($_POST['recordId'],"equipment_id")==$_SESSION['active_maint_equipment'] && can_super_access($page)==true){ 

$attachment = get_maintequipmentrecord_info($_POST['recordId'],"attachment"); 
$attachment_file = $_SERVER['DOCUMENT_ROOT']."/_files/maintenance/attachments/".$attachment; 

if($attachment!='' && file_exists($attachment_file)) { 
    unlink($attachment_file); 
} 

$stmt = $connect->prepare("UPDATE maintenance_records SET attachment=NULL WHERE record_id=?"); 
$stmt->bind_param("si", $_POST['recordID']); 
$stmt->execute(); 
$stmt->close(); 

} 

残念ながら、PHPスクリプトとそれに付随する関数が適切に実行されているため、実際に問題が見つかりませんでした(ファイルがサーバーから削除され、データベースフィールドが設定されていますNULLに設定します。 誰か手掛かりですか?ありがとう!

編集12/9/17 JSをデータ部分で更新しました。また、SQLインジェクションを防ぐために、MySQLにデータを挿入するためのPHPコードを更新しました。それについてのコメントのために多くのありがとう!それでも、スクリプトがエラー500 を返しますが、PHPのログには、次のことを示しています

[12-9月 - 2017年21時04分45秒ヨーロッパ/ベルリン] PHPの警告:> mysqli_stmt :: bind_param():型定義文字列の要素数>> /アプリケーション/MAMP/htdocs/functions/maintenance_functions.phpオンライン$ [12-Sep-2017 21:04:45ヨーロッパ/ベルリン]のバインド変数の数と一致しませんスタックトレース: [12-Sep-2017 21:04:45ヨーロッパ/ベルリン] PHP 1. {main}()> /アプリケーション/MAMP/htdocs/functions/maintenance_functions.php:0 [12-Sep-2017 21 :04:45ヨーロッパ/ベルリン] PHP 2. mysqli_stmt-> bind_param()> /アプリケーション/MAMP/htdocs/functions/maintenance_functions.php:104

まだファイルはサーバーから削除されているので、コードの一部を実行することができます。しかし、値はデータベースから削除されませんが、私はSQLクエリで何が間違っているか見ることはできません。 参考までに、アプリケーションはローカルのWebサーバー(nginx + mysql)上で実行されていますが、これは常にインターネットから切断されます。

+2

詳細については、Webサーバーのエラーログを参照してください。 –

+4

[Little Bobby](http://bobby-tables.com/)によると*** [あなたのスクリプトはSQLインジェクション攻撃の危険にさらされています。](http://stackoverflow.com/questions/60174/how-can- i-prevent-sql-injection-in-php)*** [prepared](http://en.wikipedia。org/wiki/Prepared_statement)のステートメント([MySQLi](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php))を参照してください。 [文字列をエスケープする](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string)でも安全ではありません! –

+0

いくつかあります - ファイル、不正な形式のSQLクエリなどを削除できません – cstruter

答えて

0

あなたはここでしかつの識別子が必要になります。

$stmt->bind_param("si", $_POST['recordID']); 

は次のようになります。

$stmt->bind_param("i", $_POST['recordID']); // you don't have two elements 

次の2つの要素を識別"si"が、1つの変数のみを持っているので、あなたが不一致を取得します。その変数は整数なのでsを取り除いて"i"のままにしておきます。

+0

多くのおかげで、それは解決策ではありませんでしたが、あなたのコメントは少なくとも私のコードを改善しました! –

0

問題を解決しました。 非常に愚かですが、このコードの上の行に小さなエラーがありました(それでも、なぜコードの一部が動作しているのか、別の部分が動作していないのか分かりません...) しかし、コードを実際に改善しました:)

関連する問題