【问题标题】:What is wrong with my SQL Insert code?我的 SQL 插入代码有什么问题?
【发布时间】: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


【解决方案1】:

@paj:改变

if ($ok) {

if (mysql_query($sql)) {

-

我还建议您将 SQL 语句更新为

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

$sql = "INSERT IGNORE INTO tracks (trackid, albumid, composerid) VALUES (" . $trackid . ", " . $albID . ", " . $cid . ")";

【讨论】:

  • 我不太介意苛刻的 cmets。我确实发现一些 cmets 比其他 cmets 更有帮助。谢谢你的帮助。我看到插入代码中的值只是表字段的名称。我已将其更改为您建议的内容。虽然在添加新曲目后我没有收到错误消息,但查看曲目表我看到列出了新的曲目标题,但专辑 ID 和作曲家 ID 为 0。将进一步调查。谢谢
【解决方案2】:

在我看来$ok 不存在,除了if ($ok) { 线。它需要事先在某个地方定义,否则它总是会读取为 false,因为它不存在。

实际上,您可以跳过不存在的 $ok 并像上面那样为该行输入if (@mysql_query($sql)) {。我确实必须同意 cmets 的代码需要一些爱,但如果你想知道它为什么会崩溃,看来这就是原因。

【讨论】:

  • 谢谢,非常有帮助。我从教程/书籍开始,然后为我自己的项目改编了一本,以尝试了解它是如何工作的。我想这就是为什么我忽略了这样的部分。谢谢。
  • 没问题。祝学习顺利。由于您是新的 stackoverflow 用户,因此您还应该从“接受”最有帮助的答案开始。很高兴我们能提供帮助。
猜你喜欢
  • 1970-01-01
  • 2023-04-10
  • 2016-09-25
  • 1970-01-01
  • 2019-04-02
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多