Sadece ("ilişkisi yok") PostgreSQL tablo adı kullanamazsınız

5 Cevap php

Ben basit bir veritabanı sorgusu yapmak için aşağıdaki PHP komut dosyasını çalıştırmak çalışıyorum:

$db_host = "localhost";
$db_name = "showfinder";
$username = "user";
$password = "password";
$dbconn = pg_connect("host=$db_host dbname=$db_name user=$username password=$password")
    or die('Could not connect: ' . pg_last_error());

$query = 'SELECT * FROM sf_bands LIMIT 10';
$result = pg_query($query) or die('Query failed: ' . pg_last_error());

Bu aşağıdaki hata üretir:

Sorgu başarısız oldu: HATA: ilişki "sf_bands" yok

Onların tablo adı büyük harf kullanmak çünkü birisi ilişkisi yok bildiren bir hata alır nerede bulabilirsiniz tüm örneklerde, bu kadar. Benim tablo adı büyük harf yoktur. Veritabanı adı dahil olmadan benim tablosunu sorgulamak için bir yol var mı, yani showfinder.sf_bands?

5 Cevap

Okuduğum kadarıyla, bu hata doğru tablo adı başvuran değiliz demektir. Yaygın bir nedeni tablo karışık durumda yazım ile tanımlanır ve tüm alt-dava ile onu sorgulamak için çalışıyoruz olmasıdır.

Diğer bir deyişle, aşağıdaki başarısız:

CREATE TABLE "SF_Bands" ( ... );

SELECT * FROM sf_bands;  -- ERROR!

Tablo tanımlandığı gibi özel karışık durumda yazım kullanabilirsiniz böylece tanımlayıcıları sınırlandırmak için çift tırnak kullanın.

SELECT * FROM "SF_Bands";


Onun şema eleme olmadan bir tablo adı başvuru yaptığınızda, sorgu sırayla kontrol her şema tarafından bu tablo adı eşleşen böylece Yorumlarınız Re, sen "search_path" bir şema ekleyebilirsiniz. Sadece PATH kabuğunda veya include_path PHP, vb gibi Eğer mevcut şema arama yolu kontrol edebilirsiniz:

SHOW search_path
  "$user",public

Eğer şema arama yolu değiştirebilirsiniz:

SET search_path TO showfinder,public;

Ayrıca bakınız http://www.postgresql.org/docs/8.3/static/ddl-schemas.html

Ben bu sorunları vardı ve bu (Acı ama gerçek) bir hikaye:

  1. If your table name is all lower case like : accounts you can use: select * from AcCounTs and it will work fine

  2. If your table name is all lower case like : accounts The following will fail: select * from "AcCounTs"

  3. If your table name is mixed case like : Accounts The following will fail: select * from accounts

  4. If your table name is mixed case like : Accounts The following will work OK: select * from "Accounts"

Ben bu gibi gereksiz şeyler hatırlayarak sevmiyorum ama sen ;) zorunda

Her şey yukarıda yayınlanmıştır başarısız olursa, bağlantı dizesinde Dbname parametre koymak deneyin. Başka her şey başarısız iken benim için çalışıyor.

Diğer RDMS'e farklı Postregs süreç sorgu. Bu gibi önce bir tablo adı çift tırnak içinde şema adını koymak, "SCHEMA_NAME". "SF_Bands"

pg_query($dbconn, $query);

veritabanı bağlantısı başarılı olduğundan emin olun ...