簡體   English   中英

如何為此SQL查詢更正我的PHP代碼?

[英]How can I correct my PHP code for this SQL query?

我已經弄了好一陣子,我快到了。 只需要穿過我碰到的那堵牆。

我有以下表格:

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對我來說是新事物。 但是一次一個障礙。

謝謝

您的INSERT語法不正確。 您正在嘗試使用UPDATE語法插入。

你在嘗試:

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)(下)建議使用參數化值,這顯然比addlashes()更好。 老實說,我不知道PHP已經有了。

問題出在您的查詢中。 嘗試使用mysql_error函數獲取有關您做錯了什么的更多信息。

例如,您的INSERT語句格式不正確。

你有:

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

應該是這樣的:

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

我之前的回答是錯誤的(已刪除)。 現在我了解到您的插入語法確實有效。

但是,您不執行的操作是轉義您在查詢中輸入的值。 如果$ tracktitle包含任何無效字符(如單引號),則可能會中斷查詢。

您應該在構建插入查詢之前添加以下行:

$tracktitle = mysql_real_escape_string($tracktitle);

您當前的代碼非常瑣。 如果要插入一首歌曲,並且要在歌曲名稱中輸入YourF ... ed,哦,順便說一句。 刪除數據庫YourDataBaseName; 您應該嘗試想象會發生什么。

這稱為SQL注入。 因為您沒有正確地轉義該值,所以其他人可以通過將陳述插入到html表單字段中來關閉該陳述。

我不知道這是否是您的查詢現在不起作用的原因(僅當您鍵入無效字符時它才會中斷),但是目前這是一個嚴重的問題。

為了找出確切的錯誤,當mysql_query()返回false時,應該顯示mysql_error()的結果。 這可能比我們在這里所做的任何隨機猜測都對您有更大的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM