Ошибка MySQL, я не вижу, что не так - PullRequest
0 голосов
/ 10 ноября 2009

Я использую этот код для ввода прав пользователя на обновление веб-приложения:

$updaters = array();
for ($i = 1; $i <= 24; $i++){    
  if (isset($_POST['permsA['.$i.']']))        
   $updaters[] = '`'.$i.'` = \''.mysqli_real_escape_string($db, $_POST['permsA['.$i.']']).'\'';
  }
$insert = mysqli_query($db,'UPDATE `tbl_perms` SET '.implode(',', $updaters).    'WHERE `userid` = '.$id)or die(mysqli_error($db)); 

Я получаю ошибку от SQL:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE `userid` = 1' at line 1

Я не могу переписать код, чтобы устранить ошибку: (

это код для генерации permsA

<?
while($i = mysqli_fetch_array($get_perms)){
$pname = $i[pname];
$id = $i[id];
?>
<div><input type="checkbox" tabindex="1" name="permsA[<? echo $id;?>]" value="1" <? if($permissionid[$id] == '1') {echo ' checked="checked" ';}?> /><?echo htmlspecialchars($pname);?></div>
<? } ?> 

Вот точный запрос, выдающий ошибку:

$insert = mysqli_query($db,'UPDATE `tbl_perms` '.$updaters.' WHERE `userid` = '.$id) or die(mysqli_error($db));

Вот что генерирует этот sql:

UPDATE `tbl_perms` SET WHERE `userid` = 1

А вот дамп переменной из переменных после POST var_dump($_POST['permsA']):

array(22) { [1]=> string(1) "1" [2]=> string(1) "1" [3]=> string(1) "1" [4]=> string(1) "1" [5]=> string(1) "1" [6]=> string(1) "1" [8]=> string(1) "1" [9]=> string(1) "1" [10]=> string(1) "1" [11]=> string(1) "1" [12]=> string(1) "1" [13]=> string(1) "1" [14]=> string(1) "1" [15]=> string(1) "1" [16]=> string(1) "1" [17]=> string(1) "1" [18]=> string(1) "1" [19]=> string(1) "1" [20]=> string(1) "1" [21]=> string(1) "1" [22]=> string(1) "1" [23]=> string(1) "1" }

Ответы [ 7 ]

2 голосов
/ 10 ноября 2009

Добавьте пробел перед предложением WHERE, но после апострофа ' WHERE

1 голос
/ 10 ноября 2009

Я вижу 2 потенциальных проблемы:

  • Поставьте пробел перед ГДЕ
  • ваша функция implode может оставить запятую, которая отбросит запрос. rtrim (взорвать (...), ',') для исправления
1 голос
/ 10 ноября 2009

Я не уверен, что это проблема, но у вас нет пробела перед ключевым словом WHERE.

1 голос
/ 10 ноября 2009

Добавить пробел перед ГДЕ

И будьте уверены, что $ Updaters заполнено.


Попробуйте это:

$updaters = array();
for ($i = 1; $i <= 24; $i++){    
  if (isset($_POST['permsA['.$i.']']))        
   $updaters[] = '`'.$i.'` = \''.mysqli_real_escape_string($db, $_POST['permsA['.$i.']']).'\'';
}
$updaters = (count($updaters) > 0) ? ' Set '.implode (',', $updaters).' ' : '';
$insert = mysqli_query($db,'UPDATE `tbl_perms` '.$updaters.' WHERE `userid` = '.$id)or die(mysqli_error($db));
0 голосов
/ 10 ноября 2009

Похоже, логическая ошибка в том, как вы ссылаетесь на значения $ _POST. Когда вы называете входные переменные суффиксом в квадратных скобках (например, "permsA []", "permsA [3]")), PHP анализирует их как массивы. Попробуйте:

for ($i = 1; $i <= 24; $i++){    
    if (isset($_POST['permsA'][$i])) {
       $updaters[] = "`$i`='".mysqli_real_escape_string($db, $_POST['permsA'][$i])."'";
    }
}

Или, еще лучше, используйте PDO и подготовленные запросы:

// keys of $permsAFields are keys we want to allow for input array 'permsA' 
static $permsAFields = array_fill(1, 24, 1);
...
// filter permsA
$permsA = array_intersect_key($_POST['permsA'], $permsAFields);
if (count($permsA)) {
    $query = $db->prepare("UPDATE `tbl_perms` SET `" . implode('`=?, `', array_keys($permsA)) . "`=? WHERE `userid`=?");
    $permsA[]=$id;
    $query->execute($permsA);
} else { // invalid input
    ...
}
0 голосов
/ 10 ноября 2009

Если вы объявили свое имя поля сообщения следующим образом: name = "permsA [$ i]", то вы должны получить к нему доступ следующим образом: $ _POST ['permsA'] [$ i].

0 голосов
/ 10 ноября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...