如何更正此SQL查询的PHP代码?

时间:2010-11-29 21:42:23

标签: php mysql phpmyadmin

我已经搞砸了一段时间了,我差不多了。只需要越过我撞到的那堵墙。

我有以下表格:

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

我可以通过PhpMyAdmin SQL选项卡和

插入新记录
INSERT INTO tracks (tracktitle, albumid, composerid) VALUES ('New Song', 1, 1);

它工作正常。

我的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,这对我来说是一件新事物。 但一次只有一个障碍......

由于

3 个答案:

答案 0 :(得分: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)."'
)

否则你的代码比煮熟的土豆更容易破解。 :)

编辑:Chad Birch(下面)建议使用参数化值,这无疑是比addslashes()更好。老实说,我不知道PHP已经有了那些。

答案 1 :(得分:0)

问题出在您的查询中。尝试使用mysql_error函数获取有关您做错的额外信息。

作为示例,您的INSERT语句格式不正确。

你有:

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

应该是这样的:

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

答案 2 :(得分:0)

我之前的回答是错的(并被删除)。我现在已经知道你的Insert语法确实有效。

但是你不做的是逃避你在查询中输入的值。如果$ tracktitle包含任何无效字符(如单引号),则可能会破坏您的查询。

您应该在构建插入查询之前添加此行:

$tracktitle = mysql_real_escape_string($tracktitle);

您当前的代码非常 dangarous。如果我要插入一首歌,并且在歌曲名称中我会输入 YourF ... ed,哦顺便说一下'; drop database YourDataBaseName; 你应该试着想象会发生什么......

这称为SQL注入。因为您没有正确地转义该值,所以其他人可以关闭该语句,只需将其插入到html表单字段中即可启动新语句。

我不知道这是否是您的查询现在无法正常工作的原因(只有在您键入无效字符时才会中断),但目前这是一个严重的问题。

要找出确切的错误,当mysql_query()返回false时,应显示mysql_error()的结果。这可能比我们在这里做的随机猜测更有帮助。