2017-04-15 6 views
2

まもなく私はWebベースのレシピ管理プログラムを作成しました。これはCodeIgnitor(2)を使って書かれています。レシピは、検索または閲覧時にリストビューで表示され、フィールドを入力/変更できる編集ビューで表示できます。エディタウィンドウを開いて変更を加えずに、Submitをクリックすることなく、リストビューでいくつかのレシピ情報を編集できるようにしたかったのです。これらの変更は、チェックボックスを設定または解除するだけです。レシピには、「新規」または「エクスポート」とマークされた特定の属性があり、これらの属性は、適切に認証されたユーザーが操作できるチェックボックスとして表示されます。CodeIgnitorでAJAXを使用してチェックボックスをクリックするとデータベース内のフィールドを更新する

これを行うための簡単なAJAXルーチンを実装する方法のコード例がいくつか見つかりました。そして、最近までCodeIgnitorを最新のバージョン3.xにアップデートしたときまでうまくいきました。

私は実際にこの作業を再開する方法を理解するためにいくつかの助けを用いることができます。また、データベースコールをCodeIgnitorフレームワークの外にあるスタンドアロンのPHPスクリプトではなく、CodeIgnitorベースのモデルに統合することさえできます。そして、私はコーディングスキルが古く、JSON、AJAXなどの技術に追いついていないので、私の特定の必要性からあまり抽象化されていない具体的な助けに感謝します。 ;-)私は同様のヘルプを求める他の投稿を見ましたが、私の状況にそれを適用する方法を理解できませんでした。

これは私が今日持っているもので、もはや機能しません。

<script language="JavaScript"><!-- 
function chkit(row, chk, field) { 

    chk = (chk==true ? "1" : "0"); 
    var url = "http://localhost/recipes/check_validate.php?number="+row+"&chkYesNo="+chk+"&field="+field; 

    if(window.XMLHttpRequest) { 
     req = new XMLHttpRequest(); 
    } else if(window.ActiveXObject) { 
     req = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    // Use get instead of post. 
    req.open("GET", url, true); 
    req.send(null); 
} 
//--> 
</script> 

それぞれ記載されているレシピは、上述のように、それに関連したいくつかのチェックボックスがあります。これは、私はこの機能が必要なページのHTMLヘッダに付加するスクリプトです。各チェックボックスは、次のようになりますソースコードで終わる:チェックボックスがオンまたはオフにクリックされたとき、私は、それを理解するよう、

<input type="checkbox" name="f_attribute6_1052" value="0" onclick="chkit(1052, this.checked, 'attribute6');" /> 

ので、と呼ばれるjavascript関数「chkitは、」レシピ番号を渡され、 (この場合は1052)、チェックボックスのステータス(trueまたはfalse)、および属性フィールドの名前(この場合は「attribute6」)が含まれます。

このスクリプトは、 'check_validate.php'というPHPスクリプトを実行します。そして、ここにそのコードがあります:

<?php 
// Would be nice to generalize this, even integrate with the recipe model code 
$dbhost = 'localhost'; // usually localhost 
$dbuser = 'username';  // database username 
$dbpass = 'password';  // database password 

$db = @mysql_connect($dbhost, $dbuser, $dbpass) or die ("Database connection failed."); 

mysql_select_db('recipe_db'); 

// Get the variables. 
$number = $_GET['number']; 
$value = $_GET['chkYesNo']; 
$field = $_GET['field']; 

$sql = "UPDATE recipes SET $field = $value WHERE recipeNumber=$number"; 

mysql_query($sql) or die(mysql_error()); 

?> 

今、私はすぐに問題があることを知っています。私はこれらのDB呼び出しを抽象化せずにmysqlを直接使用しているので、代わりにmysqliを使用するように変更する必要があります。

この最後のPHPスクリプトをモデルコード内の関数に移動して、CodeIgnitor以外のPHPスクリプトを取り除くといいでしょう。そして、私は私のHTMLヘッダーで使用しているjavascriptが古く、時代遅れで、安全ではないことを理解しています。

<?php 
// Would be nice to generalize this, even integrate with the recipe model code 
$dbhost = 'localhost';  // usually localhost, this mimics what is in the database config file 
$dbuser = 'user';  // database username 
$dbpass = 'pass'; // database password 
$dbname = 'recipes';  // database name 

$db = new mysqli($dbhost, $dbuser, $dbpass, $dbname); 

if ($db->connect_error) { 
    trigger_error('Database connection failed: ' . $db->connect_error, E_USER_ERROR); 
} 

$number = $_GET['number']; 
$value = $_GET['chkYesNo']; 
$field = $_GET['field']; 

$sql = "UPDATE recipes SET $field = $value WHERE recipeNumber=$number"; 

$rs=$db->query($sql); 

if($rs === false) { 
    trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $db->error, E_USER_ERROR); 
} else { 
    $rows_returned = $rs->num_rows; 
} 

?> 

そして、それは動作します:

は私がこれまでcheck_validate.phpを変更し、実際に訓練されたコーダないんだけど、ここで;-)

+0

https://vitalets.github.io/x-editable/ –

答えて

0

を手持ちを必要とする、覚えておいてください。私はまだ私のjsコンソールでいくつかのAccess-Control-Allow-Originエラーを取得しているので、それを追跡する必要があります。しかし、機能は復元され、以前と同じようにコードが機能します。だから、解決策はmysqlの代わりにmysqliを適切に実装しただけです。

関連する問題