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.
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)
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?
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?
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.
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?
<?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.
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…
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.