Syntax SQL error po uruchomieniu aplikacji na localhost


(Lachowski Tomasz) #1

Witam,

próbowałem przenieś aplikację z zewnętrznego serwera na lokalny.

Po konfiguracji skopiowanej aplikacji, ustawiłem połączenie z bazą danych, jednak każdorazowo podczas uruchomienia wyświetla się poniższy komunikat:


CDbException


CDbCommand nie zdołał wykonać polecenia SQL: SQLSTATE[42000]: Syntax error or access violation: 1064 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 code = 'pl' LIMIT 1' at line 1

Poniżej przesyłam zawartość application.log dotyczącej powyżej opisywanej sytuacji:


2011/10/20 13:13:51 [error] [system.db.CDbCommand] Error in querying SQL: SHOW COLUMNS FROM `Language`

2011/10/20 13:13:51 [error] [exception.CDbException] exception 'CDbException' with message 'Tabela "Language" dla bieżącego rekordu klasy "Language" nie została znaleziona w bazie danych.' in C:\Xampp\htdocs\testpage.pl\yii\db\ar\CActiveRecord.php:2244

Stack trace:

#0 C:\Xampp\htdocs\testpage.pl\yii\db\ar\CActiveRecord.php(656): CActiveRecordMetaData->__construct(Object(Language))

#1 C:\Xampp\htdocs\testpage.pl\protected\models\Language.php(18): CActiveRecord::model('Language')

#2 C:\Xampp\htdocs\testpage.pl\protected\components\TpController.php(113): Language::model()

#3 C:\Xampp\htdocs\testpage.pl\protected\components\TpController.php(28): TpController->setLangId()

#4 C:\Xampp\htdocs\testpage.pl\yii\web\CWebApplication.php(405): TpController->__construct('site', NULL)

#5 C:\Xampp\htdocs\testpage.pl\yii\web\CWebApplication.php(326): CWebApplication->createController('')

#6 C:\Xampp\htdocs\testpage.pl\yii\web\CWebApplication.php(120): CWebApplication->runController('')

#7 C:\Xampp\htdocs\testpage.pl\yii\base\CApplication.php(135): CWebApplication->processRequest()

#8 C:\Xampp\htdocs\testpage.pl\index.php(12): CApplication->run()

#9 {main} REQUEST_URI=/

2011/10/20 13:13:51 [error] [system.db.CDbCommand] Error in querying SQL: SELECT * FROM  WHERE code = 'pl' LIMIT 1

Będę wdzięczny za ewentualne rady w rozwiązaniu niedogodności.


(Maciej Lizewski) #2

Tabela "Language" dla bieżącego rekordu klasy "Language" nie została znaleziona w bazie danych.

to chyba mowi wszystko? sprawdz czy przeniosles wszystkie tabele. jesli przenosiles miedzy srodowiskiem windows i linux - sprawdz tez wielkosc liter (dla mysql pod linuksem wielkosc liter w nazwie tabeli ma znaczenie, pod windows - nie)


(Lachowski Tomasz) #3

Dzięki za odpowiedź, sprawa wygląda w ten sposób że lokalny serwer apache jest postawiony na Windowsie, a z tego co piszesz dla tego systemu wielkość liter nie ma znaczenia. Dodatkowo tabela "Language" jest fizycznie w bazie, posiadając identyczne rekordy jak w wersji online.

Głowię się nad tym tematem od tygodnia i ręce opadają - naprawdę nic nie mogę wymyślić. Czy przyczyna może leżeć jeszcze w innej kwestii?

Jeżeli jest komunikat:


Tabela "Language" dla bieżącego rekordu klasy "Language" nie została znaleziona w bazie danych.

to na bank połączenie z bazą danych zostało pomyślnie nawiązane?


(Jjw) #4

Tak, ten komunikat oznacza, że połączenie z bazą danych zostało nawiązane poprawnie.

Komunikat sugeruje, że w bazie danych nie masz tabeli powiązanej z klasą AR ‘Language’. sprawdź co zwraca metoda tableName() klasy Language. O ile w Windows nazwy plików nie mają znaczenia, o tyle nazwy table w już mogą mieć.

Czy komenda "SHOW COLUMNS FROM Language" zwraca wyniki?


(Lachowski Tomasz) #5

Dzięki za odpowiedź, metoda tableName zwraca wartość ‘Language’:


	public function tableName()

	{

		return 'Language';

	}

Odnośnie pytania dot. SHOW COLUMNS FROM Language, jak mogę najłatwiej sprawdzić czy faktycznie zwraca cokolwiek?


(Lachowski Tomasz) #6

Jest mi ktoś w stanie pomóc, będę bardzo wdzięczny. Od opisywanego momentu sytuacja bez zmian.

Patrzę teraz tak na stack trace i skoro jest taki error:


SELECT * FROM  WHERE code = 'pl' LIMIT 1

to jakimś trafem nie jest podana tabela z której pobieramy dane.

Nie wiem jednak jak odnaleźć gdzie powyższe zapytanie jest dokonywane, i jak ewentualnie sprawdzić dlaczego nie definiuje z jakiej tabeli pobiera dane.


(Adam Klosiu) #7

Wklej tutaj cały model Language i sprawdź co pokazuje SHOW COLUMNS FROM Language i najlepiej też wklej wynik zapytania. Wpisz to albo w konsoli mysql, albo w narzędziu typu PHPMyAdmin, MySQL Workbench. Zobacz też jakie masz uprawnienia na użytkowniku który łączy się z bazą ze strony Yii. Jest to root, czy jakiś inny użytkownik?


(Lachowski Tomasz) #8

Ponizej przesyłam kod modelu:


<?php


class Language extends CActiveRecord

{

	/**

	 * The followings are the available columns in table 'Language':

	 * @var integer $id

	 * @var string $code

	 * @var string $name

	 */


	/**

	 * Returns the static model of the specified AR class.

	 * @return CActiveRecord the static model class

	 */

	public static function model($className=__CLASS__)

	{

		return parent::model($className);

	}


	/**

	 * @return string the associated database table name

	 */

	public function tableName()

	{

		return 'Language';

	}


	/**

	 * @return array validation rules for model attributes.

	 */

	public function rules()

	{

		return array(

			array('code','length','max'=>2),

			array('name','length','max'=>45),

			array('code, name', 'required'),

		);

	}


	/**

	 * @return array relational rules.

	 */

	public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

			'news' => array(self::HAS_MANY, 'News', 'lang_id'),

			'subpage' => array(self::HAS_MANY, 'SubPage', 'lang_id'),

		);

	}


	/**

	 * @return array customized attribute labels (name=>label)

	 */

	public function attributeLabels()

	{

		return array(

			'id' => 'Id',

			'code' => 'Code',

			'name' => 'Name',

		);

	}

}

W wyniku polecenia SQL, uzyskałem następujące informacje:


Field 	Type 	Null 	Key 	Default 	Extra

id 	int(11) 	NO 	PRI 	NULL 	auto_increment

code 	varchar(2) 	NO 	  	NULL 	 

name 	varchar(45) 	NO 	  	NULL 	 

Natomiast w main.php, ustawione jest połączenie poprzez ‘roota’ (bez hasła), który po stronie bazy ma pełne uprawnienia.


(Adam Klosiu) #9

Wszystko wygląda ok… Przychodzi mi do głowy kilka rzeczy:

Czy masz włączone cachowanie bazy danych?

Może jest coś nie tak z samym frameworkiem? Spróbuj pobrać raz jeszcze…

Czy jest możliwe, że nie przeniosły się wszystkie dane w db? Masz skonfigurowane constrainty? Może być tak, że masz wpis w News albo Subpage, ale nie ma odpowiedniego wpisu w language…


(Lachowski Tomasz) #10

Sidewinder, wygląda na to że problem się rozwiązał.

Leżał on po stronie wpisywanego adresu (localhost).

Okazuje się że aplikacja pobiera z adresu URL rodzaj języka witryny i jeżeli nie było przyrostka (pl, en) w adresie to nie było możliwości poprawnego wczytania strony.

Dzięki wszystkim za czas poświęcony we wgłębianie się w mój przypadek.

Pozdrawiam