【发布时间】:2010-11-30 20:44:48
【问题描述】:
我正在努力找出为什么这段代码不适合我。我有表:albums (albumid, albumname)、composers (composerid, composername) 和 tracks (trackid, tracktitle, albumid, composerid)。
当我使用我的表单添加曲目并将其链接到作曲家和专辑时:
<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";
} ?>
</p>
<input type="submit" value="SUBMIT" />
</form>
<?php endif; ?>
我收到这条消息:
添加了新曲目
将曲目插入专辑 2 时出错:
曲目已添加到 0 个专辑。
表单前面的php代码是:
if (isset($_POST['tracktitle'])):
// A new track has been entered
// using the form.
$tracktitle = mysql_real_escape_string($tracktitle);
$cid= $_POST['cid'];
$tracktitle = $_POST['tracktitle'];
$albs = $_POST['albs'];
if ($cid == '') {
exit('<p>You must choose an composer for this track. Click
“返回”并重试。
');}$sql = "INSERT INTO tracks (tracktitle)
VALUES ('$tracktitle')" ;
if (@mysql_query($sql)) {
echo '<p>New track added</p>';
} else {
exit('<p>Error adding new track' . mysql_error() . '</p>
echo mysql_error() ');}
$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>
<?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>');}?>
我一直在寻找失败的原因,并且一直在碰壁。我也知道目前它不是很安全,这将是我接下来要解决的问题。我只想让实际功能首先工作。
【问题讨论】:
-
您仍在对 SQL 使用脑死字符串操作。在修复 IMOHO 之前,解决任何其他问题是没有意义的,因为修复这个基本缺陷 - 并理解 为什么 它是一个缺陷 - 是更好的开发过程的关键步骤。是的,您的代码很容易受到攻击。
-
给你的代码一些爱。当我试图阅读这些混乱时,我的头会爆炸。
-
这里有一些非常苛刻的 cmets... 他确实承认代码不安全并说“我只想让实际功能首先工作”,伙计们。 :-/
标签: php sql phpmyadmin