Postgresql Karışık durum tablo adları için PHP sözdizimi

5 Cevap php

Ben aşağıda bir kod var:

<?php
require "institution.php"
/* in this portion, query for database connection is executed, and  */

$institution= $_POST['institutionname'];

$sCampID =  'SELECT ins_id FROM institution where ins_name= '$institution' ';
$qcampID = pg_query($sCampID) or die("Error in query: $query." . pg_last_error($connection));
/* this portion outputs the ins_id */           
?>

Benim veritabanı önce ben bu sorguyu çalıştırdığınızda, o hiç hata gösterir, bu yüzden hiç karışık durum tablo isimleri vardır. Ben bazı nedenlerden dolayı benim veritabanı değiştirdim ve şimdi karışık durum tablo adlarını içerdiğinden Ama, ben bunun içine yukarıdaki kodu değiştirmek zorunda:

$sCampID =  'SELECT ins_id FROM "Institution" where ins_name= '$institution' ';

where the Institution has to be double quoted. The query returned parse error. When i removed this portion: where ins_name= '$institution', no error occured.

Benim soru nasıl bir karışık harf ve bir değişken saklanan bir değer (bu durumda $ kurum) içeren tablo adı tek bir select deyimi kombine edilecek bu sorunu çözmek mi nedir?

Cevaplarınız ve önerileriniz çok takdir edilecektir.

5 Cevap

<?php
require "institution.php"
/* in this portion, query for database connection is executed, and  */

$institution= pg_escape_string($_POST['institutionname']);

$sQuery =  "SELECT ins_id FROM \"Institution\" where ins_name= '$institution'";
$qcampID = pg_query($sQuery) 
  or trigger_error("Error in query: $sQuery." . pg_last_error($connection));
/* this portion outputs the ins_id */           
?>

Not

  • pg_escape_string herhangi bir enjeksiyon korumak için değil, kullanılması gereken, ancak sözdizimi olarak sadece bir parçası olarak.
  • trigger_error yerine hangi yankı kullanılan (ve doğru değişken adını not) olmalıdır
  • ve double quotes veya değişken tahmin edilemez olacaktır (http://php.net/types.string ref için)
  • ve çift tırnak indirir (aynı ref)

Bunun yerine çift tırnak kullanabilirsiniz

$sCampID =  "SELECT ins_id FROM \"Institution\" where ins_name= '$institution'";
$sCampID =  'SELECT ins_id FROM "Institution" where ins_name= \''.$institution.'\'';

Dize kaçan.

Başka bir yorumcu haberi olarak, SQL enjeksiyonu hakkında okuyun. Ne var enjeksiyon güvenli değildir, hazırlanan tablolarda, tercihen PDO ile bir şey kullanmayı düşünün.

Diğer yanıtlar eklemek için (tablo adı alıntı, güvenlik ve performans elde etmek için hazırlanmış deyimleri kullanın), hakkında okumak PG and tables case sensitivity. Eğer seçenek varsa, sizin db şemasını değiştirmek düşünebilirsiniz, böylece tablo adları (ve sütunlar ve genel kimliklendirici) tüm küçük harf vardır. Bu sizin sorguları biraz basitleştirmek olur - (ama tüm gerçek alıntı sorguları kontrol etmek ve onları unquote gerektirir).

Ne $ kurum aşağıdaki dize içeriyorsa olur: 'or 1 = 1; -

Yani biz bir SQL enjeksiyon saldırısı dediğimiz, ve hacker verilerinizi çalmak için bir süper-kolay yolu - ve müşterileri ile büyük sıkıntı içine alabilirsiniz.

Bir SQL sorgusu içine koyarak önce pg_escape_string kullanarak bu dizeyi () kaçmak gerekir. Benim sorguları oluşturmak için () sprintf'i kullanmak ister:

$sql = sprintf("SELECT ins_id FROM \"Institution\" where ins_name= '%s'", pg_escape_string($conn, $institution));

Yukarıdaki örnekte, $ bağlantı pg_connect'i (arayan tarafından oluşturulan bağlantı tanıtıcısı,) 'dir.