MySQL hata, yanlış ne göremiyorum

7 Cevap php

Ben bir web uygulaması üzerinde güncelleme kullanıcı izinlerini girmek için bu kodu kullanıyorum:

$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));

Ben olsun hata SQL şöyledir:

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

Ben hata kaldırmak için kodu yeniden yazmak mümkün görünmüyor olabilir: (

Bu permsA oluşturmak için kod

<?
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>
<? } ?>

Burada hata üretir tam sorgu:

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

İşte bu sql oluşturur şeydir:

UPDATE `tbl_perms` SET WHERE `userid` = 1

Ve burada POST sonrasında değişkenler değişken dökümü 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 Cevap

Ben 2 potansiyel sorunları bakın:

  • Önce nerede bir boşluk koymak
  • Lütfen implode fonksiyonu sorgu kapalı atacağım bir virgül bırakarak olabilir. RTRIM düzeltmek için (implode (...), ',')

Lütfen NEREDE deyiminden önce bir boşluk eklemek ama kesme işareti sonra ' WHERE

Ben sorun varsa emin değilim, ama WHERE anahtar kelimenin önüne hiçbir boşluk var.

Bir boşluk eklemek NEREDE önce

Ve $ güncelleyicileri dolu olduğundan emin olun.


Bu deneyin:

$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));

THe cevabı zaten sanırım dedi, ama onlar daha güvenli olduğunu ve size dize hata ayıklama sorun yedek beri ben size Parametrelenmiş sorguları tavsiye ederiz.

Apperently sabit değildir. Eğer yürütülür bütün sorgu gönderebilir miyim?

Eğer gibi yazılan alan adını ilan Eğer öyleyse: name = "permsA [$ i]" o zaman bunu bu şekilde erişmek için: $ _POST ['permsA'] [$ i].

Eğer $ _POST değerleri başvuru nasıl bir mantık hatası var gibi görünüyor. Eğer name input variables kare ayracı eki ile (örn. "permsA []", "permsA [3]"), PHP diziler olarak ayrıştırır zaman. Deneyin:

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

Ya da, daha iyisi, PDO hazırlanan ve sorguları kullanabilirsiniz:

// 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
    ...
}