несколько динамически генерируемых флажков в PHP / MySQL

0

У меня есть ряд флажков, которые выводятся из одной таблицы MySQL:

<?php
    $result = mysql_query("SELECT * FROM strategies");
    if (!$result) {
    die("Database query failed: " . mysql_error());
    }
while($row = mysql_fetch_array($result)) {
    $strategylist = $row['name'];
    $strategyname = htmlspecialchars($row['name']);
    echo '<input type="checkbox" name="strategy[]" value="' . $strategylist . '" />' . $strategyname;
}
?>

Я хочу иметь возможность хранить несколько "стратегий" для каждой строки в таблице "исследования", поэтому я использую другую таблицу (sslink) для хранения идентификатора исследования и названия стратегии. Отчасти это объясняется тем, что будет постоянно возрастать количество "стратегий", поэтому их необходимо сохранить в базе данных. Это код, который я использую в настоящее время:

<?php   



if(isset($_POST['update1']))
{
  $strategy=serialize($_POST['strategy']); //line 66, where the warning is happening

   if(!get_magic_quotes_gpc())
   {
      $strategy = addslashes($strategy);
   }

   // update the article in the database
   $query ="INSERT INTO sslink('study_id', 'strategyname') VALUES ('".$_GET['id']. "', '" .$strategy. "')";

   mysql_query($query) or die('Error : ' . mysql_error());

   $cacheDir = dirname(__FILE__) . '/cache/';

   $cacheFile = $cacheDir . '_' . $_GET['id'] . '.html';

   @unlink($cacheFile);

   @unlink($cacheDir . 'index.html');

   echo "<b>Article '$title' updated</b>";

      $strategy = stripslashes($strategy);
}


?>

И эта ошибка возвращается:

Примечание: Undefined index: стратегия в /casestudyform.php в строке 66 Ошибка: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса, используемого рядом с '' study_id ',' strategyname '). VALUES (' 1 ',' N; ')' в строке 1

Кто-нибудь знает, как это исправить? или лучший способ сделать это?

Спасибо заранее!

Теги:

3 ответа

1

Попробуйте следующее:


$query ="INSERT INTO sslink (study_id, strategyname) VALUES ('".$_GET['id']. "', '" .$strategy. "')";
  • 0
    Не забудьте экранировать параметры запроса $ _GET перед их использованием в SQL!
  • 0
    Я тоже думал об этом упомянуть, но решил придерживаться ответа :)
0

У вас есть две ошибки, которые не связаны друг с другом:

Примечание: Undefined index: стратегия в /casestudyform.php в строке 66

Как отмечает @montooner, это уведомление относится к PHP, потому что массив $_POST не содержит значения для ключа 'strategy'. То есть форма была отправлена ​​без проверки флажка стратегии. Вы должны проверить, существует ли ключ, прежде чем пытаться ссылаться на него.

 if (array_key_exists('strategy', $_POST)) ...

Ошибка: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса, используемого рядом с '' study_id ',' strategyname '). VALUES (' 1 ',' N; ')' в строке 1

Это ошибка синтаксического анализа SQL. Вы поставили одинарные кавычки вокруг столбцов в инструкции INSERT. В SQL одиночные кавычки ограничивают строковые константы, а не имена столбцов.

Если вам нужно разграничить имена столбцов (поскольку они содержат ключевые слова SQL, пробелы, специальные символы и т.д.), вы должны использовать обратную кавычку в MySQL или двойные кавычки в ANSI SQL.

Также будьте осторожны с SQL-инъекцией. Не предполагайте, что параметры HTTP-запроса содержат только целые числа или дружественные строки. Filter значения или escape их прежде чем использовать их в SQL. Функция addslashes() не является хорошим решением для защиты от SQL-инъекций.

$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);
$strategy_esc = mysql_real_escape_string($strategy);
$query ="INSERT INTO sslink(`study_id`, `strategyname`)
  VALUES ($id, '$strategy_esc')";
0

Undefined указывает, что $_POST ['strategy'] не был установлен. Могли бы вы сделать проверку здравомыслия, что у вашей формы есть это? Кроме того, эхо реального запроса было бы приятным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню