2010-11-29 17 views
0

私はしばらくこのことをやってきました。私はほとんどそこにいます。私がヒットしたこの壁を越えるだけでいいです。このSQLクエリでPHPコードを修正するにはどうすればよいですか?

tracks (trackid, tracktitle, albumid, composerid) 
albums (albumid, albumname) 
composers (composerid, composername) 

私は

INSERT INTO tracks (tracktitle, albumid, composerid) VALUES ('New Song', 1, 1); 

でphpMyAdminにSQL]タブを経由して新しいレコードを挿入することができ、それが正常に動作します:

は、私は次の表を持っています。

私のPHPフォームは同じことをしていませんが、私は何か見落とされているに違いありません。 私のaddtrackページのコードをチェックして、間違っていることを教えてもらえますか?

if (isset($_POST['tracktitle'])): 
// A new track has been entered 
// using the form. 

$cid= $_POST['cid']; 
$tracktitle = $_POST['tracktitle']; 
$albs = $_POST['albs']; 

if ($cid == '') { 
exit('<p>You must choose an composer for this track. 
Click "Back" and try again.</p>'); 
    } 

    $sql = "INSERT INTO tracks SET 
    tracks.tracktitle='$tracktitle'" ; 
    if (@mysql_query($sql)) { 
    echo '<p>New track added</p>'; 
    } else { 
    exit('<p>Error adding new track' . mysql_error() . '</p>'); 
    } 

    $trackid = mysql_insert_id(); 

    if (isset($_POST['albs'])) { 
    $albs = $_POST['albs']; 
    } else { 
    $albs = array(); 
    } 

    $numAlbs = 0; 
    foreach ($albs as $albID) { 
    $sql = "INSERT IGNORE INTO tracks (trackid, albumid, 
    composerid) VALUES " . 
"($trackid, $albs, $cid)"; 

if ($ok) { 
    $numAlbs = $numAlbs + 1; 
} else { 
    echo "<p>Error inserting track into album $albID: " . 
     mysql_error() . '</p>'; 
} 
} 
?> 

<p>Track was added to <?php echo $numAlbs; ?> albums.</p> 

<p><a href="<?php echo $_SERVER['PHP_SELF']; ?>">Add another 
track</a></p> 
<p><a href="tracks.php">Return to track search</a></p> 

<?php 
else: // Allow the user to enter a new track 

$composers = @mysql_query('SELECT composerid, composername 
FROM composers'); 
    if (!$composers) { 
exit('<p>Unable to obtain composer list from the 
database.</p>'); 
} 

$albs = @mysql_query('SELECT albumid, albumname FROM albums'); 
if (!$albs) { 
exit('<p>Unable to obtain album list from the 
database.</p>'); 
} 
?> 

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" 
method="post"> 
<p>Enter the new track:<br /> 
<textarea name="tracktitle" rows="1" cols="20"> 
</textarea></p> 
<p>Composer: 
<select name="cid" size="1"> 
    <option selected value="">Select One</option> 
    <option value="">---------</option> 
    <?php 
    while ($composer= mysql_fetch_array($composers)) { 
    $cid = $composer['composerid']; 
    $cname = htmlspecialchars($composer['composername']); 
    echo "<option value='$cid'>$cname</option>\n"; 
    } 
    ?> 
    </select></p> 
    <p>Place in albums:<br /> 
    <?php 
    while ($alb = mysql_fetch_array($albs)) { 
    $aid = $alb['albumid']; 
    $aname = htmlspecialchars($alb['albumname']); 
    echo "<label><input type='checkbox' name='albs[]' 
    value='$aid' />$aname</label><br />\n"; 
    } 
    ?> 

これをソートしてしまえば、セキュリティ問題を展開して並べ替えることができます。ここにいる誰かが私には新しいことであるPDOを調べることをお勧めします。 しかし、一度に一つのハードル....

おかげ

+0

エラーメッセージが表示されますか?そうであれば、何が表示されますか? - 編集:実際には、私は今問題を参照してください。 – Teekin

+0

最後に 'endif;'もありません( 'if:'は決して閉じません)。 – Yahel

+0

好きなDBMSはどれですか? – Teekin

答えて

1

あなたのINSERT構文が正しくありません。 UPDATE構文を使用してINSERTしようとしています。

INSERT INTO table_name SET field_name = '$value', another_field_name = '$another_value' 

しかし、あなたがやるべきこと:

あなたがしようとしている

INSERT INTO table_name (
    field_name, 
    another_field_name 
) 
VALUES (
    '$value', 
    '$another_value' 
) 

をまた、あなたは本当にこのように、addslahes()を使用する必要があります。そうしないと

INSERT INTO table_name (
    field_name, 
    another_field_name 
) 
VALUES (
    '".addslashes($value)."', 
    '".addslashes($another_value)."' 
) 

あなたのコードは、ゆでたジャガイモよりも簡単にハックすることができます。 :)

EDIT:Chad Birch(下記)は、addslashes()よりも優れたパラメータ化された値を使用することを推奨しています。私は正直なところ、PHPにすでにそれらがあることを知らなかった。

+1

'INSERT INTO table_name SET field_name = 'foo'、another_field_name = 'bar'はMySQLで完全に有効です。 – simshaun

+0

さて、私は卑劣になるでしょう!私のMySQLインストールでは動作しますが、MS-SQLでは動作しません。確かにそれは標準SQLではない? – Teekin

+1

'addslashes()'も良い保護ではありません。パラメータ化されたクエリを調べます。これは、通常、MysqliまたはPDO関数を通じて実行されます。 –

0

問題はあなたの質問にあります。 mysql_error関数を使って、間違っていることに関する追加情報を取得してみてください。

例として、INSERT文の形式が正しくありません。

あなたが持っている:

$sql="INSERT INTO tracks (tracktitle) VALUES ('$tracktitle')"; 
+0

ありがとうWifi、私はすでにコードの別のセクションでこれを修正したが、明らかにこのビットのためにそれを逃した。明らかに違いを理解していませんでした。すべての時間を学んで.... – paj

+0

問題はありませんパジ、我々はお互いを助けるためにここにいる:D歓声 –

+0

コメントの最初のバッチを詳述としてもかかわらず、まだ問題がある。それを解決することはできません.. – paj

0

私の前の答えが間違っていた(と削除されます):

$sql="INSERT INTO tracks SET tracks.tracktitle='$tracktitle'" 

それは何かのようにする必要があります。私はあなたのInsert構文が実際に有効であることを学びました。

しかし、あなたがしないのは、あなたがクエリに入れた値をエスケープすることです。 $ tracktitleに一重引用符などの無効な文字が含まれていると、クエリが壊れる可能性があります。

あなたのINSERTクエリを構築する前にこの行を追加する必要があります

$tracktitle = mysql_real_escape_string($tracktitle); 

あなたの現在のコードは非常に dangarous です。もし私が曲を挿入すると、曲名にはYourF ...と入力してください。データベースYourDataBaseNameをドロップします。何が起こるか想像してみてください。

これはSQLインジェクションと呼ばれています。値を正しくエスケープしないので、他の誰かがhtmlフォームフィールドに挿入するだけで、文を閉じることができます。

これがあなたのクエリが現在機能していない理由であるかどうかはわかりませんが(無効な文字を入力した場合にのみ壊れます)、現時点では重大な問題です。

正確なエラーを調べるには、mysql_query()がfalseを返すときにmysql_error()の結果を表示する必要があります。これはおそらく私たちがここで作ることができるランダムな推測よりもあなたを助けるでしょう。

+0

ありがとうございます。私はさらに掘り下げてPDOのものを読み上げます。 – paj

関連する問題