Koşullu güncelleştirme gerçekleştirmek için çalışıyoruz MySQL veya PHP sözdizimi gözetim

6 Cevap php

Ben bu bir kaçışa konu ya da bir şey olduğunu düşünüyorum. Ben sorguyu çalıştırmak ve tüm değişkenleri doldurmak, her şeyi şeftali ve tüm satır DB düzgün güncellenir.

Bana bu dinamik / sinek sorgularında contructed ve ben ipin ucunda kulüpler ile haddeleme almak için StackOverflow baktı.

Benim şeyler bu gibi görünüyor:

$sql="UPDATE users SET ";

if (!empty($fname)) { "fname = '$fname', ";}

if (!empty($lname)) { "lname = '$lname', ";}

if (!empty($location)) { "location = '$location', ";}

if (!empty($url)) { "url = '$url', ";}

"WHERE id = '$id' LIMIT 1";

Error: 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 '' at line 1 : Ben şu almaya devam "ifs" eklemek için sorguyu kestiğinizde

Ben sorgu ECHO'd ve bazı garip nedenle bu Nto tamamlandığını ve sorgu şöyle başlamadan önce değişkenlerin geliyor

fname = 'Rob', lname = 'Smith', location = 'Jersey City, NJ', url = 'http://somesite.com ', UPDATE kullanıcılar SET Error: 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 '' at line 1

Üzgünüm net değilim eğer. Gerektiğinde ben açıklığa kavuşturacaktır. Tüm bu yeni duyuyorum. Teşekkür ederiz!

6 Cevap

Eğer SET son şey sonra bir virgül için izin değiliz.

Kolay bir çözüm şudur:

$set = array();
if (!empty($fname)) { $set[] = "fname = '$fname'";}
if (!empty($lname)) { $set[] = "lname = '$lname'";}
if (!empty($location)) { $set[] = "location = '$location'";}
if (!empty($url)) { $set[] = "url = '$url'";}

if(!empty($set)) {
  $sql = "UPDATE users SET ";
  $sql .= implode(', ', $set)
  $sql .= " WHERE id = '$id' LIMIT 1";
}

Oh, ve emin sorguda shoving konum değişkenleri SQL güvenli yapmak; aksi takdirde, bir SQL enjeksiyon sorunu var.

Bu programlama dillerinde Unutmayın, her deyim (bir ;) ile biten bir metin çok tam bir cümle gibi. Bunu mantıklı bir özne-nesne-fiil gerekir. Ben sadece diyemem

 doggy;

Söylemek zorunda

 feed the doggy;

Benzer şekilde, ben sadece diyemem

 "fname = '$fname', "

Yani "Ben erken başladı sorgu için bu dizeyi ekleyin". Ben açık olmak zorunda:

 $sql .= "fname = '$fname', ";

Ben "$ sql için bu metin ekleme" diyorum. Onun tam bir cümle.

Daha iyi bir diziye bütün SET yapmaya koymak ve bir dizeye onları patlamaya. Emin olabilirsiniz Bu şekilde hiçbir sarkan virgül vardır. Gibi bir şey:

if (!empty($fname)) $sets[]="fname = '$fname' ";
if (!empty($lname)) sets[]= "lname = '$lname' ";
if (!empty($location)) sets[]= "location = '$location' ";
if (!empty($url)) sets[]= "url = '$url' ";

$setstring= implode(',',$sets);
if($setstring) {
  $query="UPDATE users SET $sets WHERE id = '$id' LIMIT 1";
  //run query, etc.
}

Değil gerçekten doğrudan bir cevap ama dinamik sorguları i kullanmanızı öneririz PDO. Bu şekilde daha güvenli, şık ve kolay isteğe bağlı parametreleri belirtebilirsiniz.

<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
?>

Lütfen sorguları büyük hale gelirse, artık bir şeyler yapıyorsun şekilde korumak oldukça karmaşık olacaktır.

echo sorgunuzla dışarı ve SET caluse içinde virgül bir göz atın. Eğer çok fazla var mı? Yeterli değil mi? Ben size bir ekstra virgül bulacaksınız düşünüyorum. Muhtemelen SET maddesini oluşturmak için implode() fonksiyonunu kullanmak isteyeceksiniz. Bu uygun yerlere virgül uygun sayıda ekler.

O WHERE "" = http://www.stackoverflow.com url "söndürmeden ve belki bir sorun neden olabilir anlamına gelir NEREDEN önce iki sorunları görmek, hiçbir boşluk yoktur.

Ayrıca, her SET fıkra, listedeki son bir virgül olmamalıdır sonunda bir virgül vardır.