Как я могу исправить свой код PHP для этого запроса SQL? - PullRequest
0 голосов
/ 30 ноября 2010

Я уже некоторое время возился с этим, и я почти на месте.Просто нужно пройти эту стену, которую я ударил.

У меня есть следующие таблицы:

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

Я могу вставить новую запись через вкладку SQL PhpMyAdmin с помощью

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

, и она работает нормально.

Моя форма PHP, хотя и не делает то же самое, и я, должно быть, что-то упустил.Пожалуйста, кто-нибудь может проверить код моей страницы надстройки и сказать мне, что не так?

 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 ]

1 голос
/ 30 ноября 2010

Ваш синтаксис 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'
)

Кроме того, вы действительно должны использовать addlahes (), например:

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

В противном случае ваш код легче взломать, чем вареная картошка. :)

РЕДАКТИРОВАТЬ: Чед Берч (ниже) предлагает скорее использовать параметризованные значения, что по общему признанию лучше, чем addlashes (). Честно говоря, я не знал, что в PHP они уже есть.

0 голосов
/ 30 ноября 2010

Мой предыдущий ответ был неверным (и удаляется).Теперь я узнал, что ваш синтаксис Insert действительно действителен.

Но что вы не делаете, так это экранируете значение, которое вы указали в запросе.Если $ tracktitle содержит недопустимые символы, например, одинарную кавычку, это может нарушить ваш запрос.

Вы должны добавить эту строку перед построением запроса на вставку:

$tracktitle = mysql_real_escape_string($tracktitle);

Ваш текущий код очень опасен.Если бы я вставил песню и в названии песни набрал бы YourF ... ed, о, кстати ';отбросить базу данных YourDataBaseName; вам следует попытаться представить, что происходит ..

Это называется SQL-инъекцией.Поскольку вы неправильно экранируете значение, кто-то другой может закрыть статистику и начать новую инструкцию, просто вставив ее в поле формы HTML.

Я не знаю, является ли это причиной того, что ваш запроссейчас не работает (он ломается только при вводе недопустимого символа), но это серьезная проблема на данный момент.

Чтобы узнать точную ошибку, вы должны отобразить результаты mysql_error (), когда mysql_query () возвращает false.Это, вероятно, поможет вам больше, чем любые случайные предположения, которые мы можем сделать здесь.

0 голосов
/ 30 ноября 2010

Проблемы в ваших запросах.Попробуйте использовать функцию mysql_error, чтобы получить дополнительную информацию о том, что вы делаете неправильно.

Например, ваш оператор INSERT искажен.

У вас есть:

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

быть что-то вроде:

$sql="INSERT INTO tracks (tracktitle) VALUES ('$tracktitle')";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...