2009-06-25 22 views
0

私は1つのMySQLテーブルから出てきている一連のチェックボックスがあります。私は上の各行に複数の「戦略」を記憶することができるようにしたい複数の動的に生成されたチェックボックス

<?php 
    $result = mysql_query("SELECT * FROM strategies"); 
    if (!$result) { 
    die("Database query failed: " . mysql_error()); 
    } 
while($row = mysql_fetch_array($result)) { 
    $strategylist = $row['name']; 
    $strategyname = htmlspecialchars($row['name']); 
    echo '<input type="checkbox" name="strategy[]" value="' . $strategylist . '" />' . $strategyname; 
} 
?> 

を"study"テーブルで、私は研究のIDと戦略の名前を格納する別のテーブル(sslink)を採用しています。これは、「戦略」がますます増えていくため、データベースに格納する必要があるためです。これは私が現在使用しているコードです:

<?php 



if(isset($_POST['update1'])) 
{ 
    $strategy=serialize($_POST['strategy']); //line 66, where the warning is happening 

    if(!get_magic_quotes_gpc()) 
    { 
     $strategy = addslashes($strategy); 
    } 

    // update the article in the database 
    $query ="INSERT INTO sslink('study_id', 'strategyname') VALUES ('".$_GET['id']. "', '" .$strategy. "')"; 

    mysql_query($query) or die('Error : ' . mysql_error()); 

    $cacheDir = dirname(__FILE__) . '/cache/'; 

    $cacheFile = $cacheDir . '_' . $_GET['id'] . '.html'; 

    @unlink($cacheFile); 

    @unlink($cacheDir . 'index.html'); 

    echo "<b>Article '$title' updated</b>"; 

     $strategy = stripslashes($strategy); 
} 


?> 

をそして、これは返されるエラーです:

お知らせ:未定義のインデックス:行66 エラーに/casestudyform.phpでの戦略:あなたが持っていますSQL構文のエラー。 'study_id'、 'strategyname'の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを参照してください)VALUES( '1'、 'N;') '1'行

これを修正しますか?またはそれを行うためのより良い方法は?

ありがとうございます!

答えて

1

これを試してみてください:


$query ="INSERT INTO sslink (study_id, strategyname) VALUES ('".$_GET['id']. "', '" .$strategy. "')"; 
+0

SQLで使用する前に$ _GET要求パラメータをエスケープすることを忘れないでください! –

+0

私はあまりにも言及について考えたが、私は答えに固執すると思った:) –

0

未定義のインデックスは、$ _POST [ '戦略は']設定されていないことを示唆しています。あなたのフォームにそれがあることを確認することができますか?また、実際のクエリのエコーもいいでしょう。

0

あなたがお互いに関係のない2個のエラーがあります。@montoonerが指摘するように、この通知がある行に/casestudyform.phpにおける戦略66

お知らせ:未定義のインデックスをPHPの$_POST配列に'strategy'キーの値が含まれていないためです。つまり、戦略チェックボックスをオンにしないでフォームが送信されました。キーを参照しようとする前に、そのキーが存在するかどうかをテストする必要があります。

if (array_key_exists('strategy', $_POST)) ... 

エラー:あなたはあなたのSQL構文でエラーが発生しています。 'study_id'、 'strategyname'の近くでVALUES( '1'、 'N;') 'を使用するには、MySQLサーバーのバージョンに対応するマニュアルをチェックしてください)

SQL解析エラーです。 INSERTステートメントの列の周りに一重引用符を入れました。 SQLでは、一重引用符は列名ではなく文字列定数を区切ります。

カラム名を区切る必要がある場合(SQLキーワード、空白、特殊文字などが含まれているため)、MySQLでバッククォートを使用するか、ANSI SQLで二重引用符を使用する必要があります。

SQLインジェクションにも注意してください。 HTTPリクエストパラメータに整数またはフレンドリ文字列しか含まれていないと想定しないでください。 FilterまたはSQLで使用する前にescapeを入力してください。 addslashes()関数は、SQLインジェクションから保護するための良い解決策ではありません。

$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT); 
$strategy_esc = mysql_real_escape_string($strategy); 
$query ="INSERT INTO sslink(`study_id`, `strategyname`) 
    VALUES ($id, '$strategy_esc')"; 
関連する問題