ошибка вставки строки запроса в db php-mysql - PullRequest
0 голосов
/ 21 февраля 2012

код обновлен

у меня есть таблица с именем голосования с тремя полями: ans_1, ans_2, ans_3, число строк запроса равно 2 или 3 в соответствии с ответами администратора.собирается сохранить, чтобы они выглядели так: 1 = aaa & 2 = bbb или? 1 = aaa & 2 = bbb & 3 = ccc моя точка зрения - сохранить каждую строку запроса в столбце, поэтому я использую приведенный ниже код, но он продолжает использовать последнее значение запросатолько строка

$queries = $_SERVER['QUERY_STRING'];
$answers = explode("&",$queries );
$num = count($answers);
foreach($answers as $val){
$chars= strlen($val);
$test = substr($val,2,$chars-2);
for($x=1; $x<=$num; $x++){
    $Q = "update vote set ans_'$x' = '$test' where Vote_ID = '1'";
    $R = mysql_query($Q);
    if($R) { echo "done"; } else { echo mysql_errno(); }    
    }
}

Ответы [ 4 ]

2 голосов
/ 21 февраля 2012

Если у вас есть динамические столбцы, для которых вы подставляете $x, не заключайте $x в кавычки:

$Q = "update vote set ans_$x = '$test' where Vote_ID = '1'";

Обязательно экранируйте содержимое $_SERVER['QUERY_STRING'] с помощью mysql_real_escape_string().

$test = mysql_real_escape_string($test);

Правильный способ синтаксического анализа строки запроса в PHP - это parse_str(), вместо попытки explode() на &.

* 1017.*

Однако, поскольку вы захватываете всю строку запроса и не фильтруете какие-либо конкретные переменные, почему бы просто не использовать $_GET?

$x = 0;
foreach ($_GET as $key=>$value) {
   // do the loop...
   $test = mysql_real_escape_string($value);
   $Q = "update vote set ans_'$x' = '$test' where Vote_ID = '1'";
   $x++;
}

Обновление

, чтобы помочь вам понятьпочему ваш код не работает, я изменю его здесь.Однако это не предпочтительный метод выполнения этой задачи.Использование foreach($_GET), как указано выше, намного лучше.Правильный отступ цикла поможет выявить проблему:

$queries = $_SERVER['QUERY_STRING'];
$answers = explode("&",$queries );
$num = count($answers);

// Your foreach loops over the available querystring params:
// Start by initializing $x to 0
$x = 0;
foreach($answers as $val){
  $chars= strlen($val);
  $test = substr($val,2,$chars-2);

  // You are already inside the foreach loop, so
  // you don't want to start another loop which uses the same value for $test
  // on each iteration.  Instead $x was set to 0 before the outer foreach...
  // There is no need for an inner loop.
  //for($x=1; $x<=$num; $x++){
    // On first iter here, $x is 0. Increments at the end of the loop iter.
    $Q = "update vote set ans_$x = '$test' where Vote_ID = '1'";
    $R = mysql_query($Q);
    if($R) {
      echo "done"; 
    } else { 
      echo mysql_errno(); 
    }
    // On each iteration, increment $x here.
    $x++;
  //} // the inner for loop, commented out...
}
1 голос
/ 21 февраля 2012

Мое предложение было бы не использовать SQL / PHP в этом методе.

Однако, чтобы ответить, почему он не работает, вы не можете использовать переменную PHP, чтобы установить столбец в запросе, как он у вас есть.

Вам необходимо изменить $Q = "update vote set ans_'$x' = '$test' where Vote_ID = '1'"; на:

$Q = "update vote set ans_$x = '$test' where Vote_ID = '1'";

Обязательно очистите пользовательский ввод для ожидаемого типа данных.

1 голос
/ 21 февраля 2012

Удалите кавычки вокруг вашей переменной. Можно использовать mysql_real_escape_string, если вы получаете значения для запроса.

$Q = "update vote set `ans_$x` = '" . mysql_real_escape_string($test) . "' where Vote_ID = '1'";
1 голос
/ 21 февраля 2012

Вам необходимо удалить одинарные кавычки. Попробуйте:

$Q = "update vote set ans_$x = '$test' where Vote_ID = '1'";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...