Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [yii] PHP notice Undefined variable
Forum PHP.pl > Forum > Przedszkole
Marek607
Witam,

Nie wiem czy to bardziej do przedszkola czy do działu o frameworkach, ale dałem tutaj - jak zły dzial to poprosze o przeniesienie.
Kupiłem książke z helionu o yii framework i mam dziwny problem - nie chce mi wykonać prostego kodu, tylko wyświetla informacje - przykładowe 2 kody:

  1. <?php
  2. class FormularzdaneController extends CController
  3. {
  4. public function actionIndex()
  5. {
  6. if($_POST['wyslano'] == 'tak')
  7. {
  8. $Polaczenie = Yii::app()->db;
  9. $Zapytanie = $Polaczenie->createCommand('INSERT INTO osoby (imie,nazwisko) VALUES (:imie,:nazwisko)');
  10. $Zapytanie->bindParam(":imie",$_POST['imie'],PDO::PARAM_STR);
  11. $Zapytanie->bindParam(":nazwisko",$_POST['nazwisko'],PDO::PARAM_STR);
  12. $Zapytanie->execute();
  13. echo '<div>Dane zostały umieszczone w tabeli.</div>';
  14. }
  15. echo '<form action="formularzdane" method="post">
  16. Imię: <input type="text" name="imie" /><br />
  17. Nazwisko: <input type="text" name="nazwisko" /><br />
  18. <input type="hidden" name="wyslano" value="tak" />
  19. <input type="submit" value="Dodaj" />
  20. </form>';
  21. }
  22. }
  23. ?>


błąd: Undefined index: wyslano z oznaczeniem na czerwono: if($_POST['wyslano'] == 'tak')
Po wyłączeniu trybu developerskiego mam error 500 z tym samym kodem.

Wiem czego tyczy błąd jednak nigdy brak zmiennej (bo będzie ona dopiero po wypelnieniu formularza) nie powodowało że nie wyświetał się formularz:
http://scr.hu/0anw/4n6g0

Doszłem już do 2 formularza i jest taki sam problem, więc proszę o pomoc.
Turson
Ogólnie kod fatalny tongue.gif Całkowicie zgubiłeś sens MVC

Kontroler
  1. <?php
  2. class FormularzdaneController extends CController
  3. {
  4. public function actionIndex()
  5. {
  6. if(isset($_POST)){
  7. $Polaczenie = Yii::app()->db;
  8. $Zapytanie = $Polaczenie->createCommand('INSERT INTO osoby (imie,nazwisko) VALUES (:imie,:nazwisko)');
  9. $Zapytanie->bindParam(":imie",$_POST['imie'],PDO::PARAM_STR);
  10. $Zapytanie->bindParam(":nazwisko",$_POST['nazwisko'],PDO::PARAM_STR);
  11. $Zapytanie->execute();
  12. return $zapisano;
  13. }
  14. $this->render('index', array(
  15. 'zapisano'=>$zapisano,
  16. ));
  17. }
  18. }


Widok:
  1. <?PHP if(!isset($zapisano)):?>
  2. //Wyświetlenie formularza
  3. <?PHP endif;?>

Ogólnie formularze tworzy się inaczej: http://www.yiiframework.com/doc/guide/1.1/pl/form.view

Po trzecie zapisywanie danych w kontrolerze wygląda nieco inaczej. Używasz $model->attributes, $model->save

Po czwarte, Yii ma własny sposób zapytań do bazy w modelu, w typie:
  1. $cmd = Yii::app()->db->createCommand();
  2. $row = $cmd->from($this->tableName())
  3. ->select('*')
  4. ->where('id=:id', array('id'=>$id))
  5. ->queryRow();
Marek607
Przykłady są podane bezpośrednio kopiuj-wklej z książki http://helion.pl/ksiazki/yii-framework-luk...osna,yiifra.htm - podpowiesz mi jeszce co poprawić w tym kontrolerze?

  1. <?php
  2. class FormularzController extends CController
  3. {
  4. public function actionIndex()
  5. {
  6. $ModelOsoby = new OsobyFormularz;
  7. if(isset($_POST['OsobyFormularz']))
  8. {
  9. $ModelOsoby->attributes = $_POST['OsobyFormularz'];
  10. if($ModelOsoby->validate())
  11. {
  12. $ModelOsoby->save();
  13. $Zapisano = true;
  14. }
  15. }
  16. $this->render('formularz',
  17. 'model'=>$ModelOsoby,
  18. 'Zapisano'=>$Zapisano
  19. )
  20. );
  21. }
  22. }
  23. ?>


Model:
  1. <?php
  2. class OsobyFormularz extends CActiveRecord
  3. {
  4. public $id;
  5. public $imie;
  6. public $nazwisko;
  7. public static function model($className=__CLASS__)
  8. {
  9. return parent::model($className);
  10. }
  11. public function tableName()
  12. {
  13. return 'osoby';
  14. }
  15. public function attributeLabels()
  16. {
  17. return array(
  18. 'id' => 'ID',
  19. 'imie' => 'Imię',
  20. 'nazwisko' => 'Nazwisko',
  21. );
  22. }
  23. public function rules()
  24. {
  25. return array(
  26. array('imie', 'required'),
  27. array('nazwisko', 'required'),
  28. );
  29. }
  30. }
  31. ?>


Widok:

  1. <div class="form" style="padding: 15px;">
  2. <?php $form=$this->beginWidget('CActiveForm', array(
  3. 'id'=>'osoby-formularz',
  4. 'enableAjaxValidation'=>false,
  5. )); ?>
  6. <p class="note">Pola oznaczone <span class="required">*</span> są wymagane.</p>
  7. <?php
  8. if($Zapisano == true)
  9. {
  10. echo '<div style="color: #600000;">Dane zostały zapisane.</div>';
  11. }
  12. ?>
  13. <?php echo $form->errorSummary($model); ?>
  14. <div class="row">
  15. <?php echo $form->labelEx($model,'imie'); ?>
  16. <?php echo $form->textField($model,'imie'); ?>
  17. <?php echo $form->error($model,'imie'); ?>
  18. </div>
  19. <div class="row">
  20. <?php echo $form->labelEx($model,'nazwisko'); ?>
  21. <?php echo $form->textField($model,'nazwisko'); ?>
  22. <?php echo $form->error($model,'nazwisko'); ?>
  23. </div>
  24. <div class="row buttons">
  25. <?php echo CHtml::submitButton('Dodaj'); ?>
  26. </div>
  27. <?php $this->endWidget(); ?>
  28. </div>


mam podobnie jak powyżej, czyli:
http://scr.hu/0anw/3ry6a

Miałem się uczyć z dokumentacji, ale zawsze wolałem książkę - chyba jednak zmienie zdanie skoro twierdzicie że uczy złych nawyków.
Turson
Szczerze mówiąc nie rozumiem czemu wywaliło Ci błąd, bo sam tak stosuję i jest ok.
  1. <?php
  2. class FormularzController extends Controller{
  3. public function actionIndex(){
  4. $ModelOsoby = new OsobyFormularz;
  5. if(isset($_POST['OsobyFormularz'])){
  6. $ModelOsoby->attributes = $_POST['OsobyFormularz'];
  7. if($ModelOsoby->validate()){
  8. $ModelOsoby->save();
  9. $Zapisano = true;
  10. }
  11. }
  12. else{
  13. $Zapisano = false;
  14. }
  15. $this->render('formularz',array(
  16. 'model'=>$ModelOsoby,
  17. 'Zapisano'=>$Zapisano
  18. ));
  19. }
  20. }
  21. ?>

w widoku if($Zapisano===true)


Przykład z posta #1 jest serio z książki? W takim razie dobre jaja
tomxx
Jeżeli pierwszy raz ładujesz stronę, to w zmiennej $_POST nie ma indeksu ['wyslano'], ponieważ formularz nie został jeszcze wysłany (więc zmienna $_POST jest pusta). Wpisz:
  1. if(@$_POST['wyslano'] == 'tak')
Turson
Zamiast wygłuszać błędy to lepiej isset jak z resztą podałem w kodach wyżej.
Marek607
Dzięki Turson - dodanie else pomogło.

Tak, są to przyklady z książki - póki co to się nie zniechęcam tylko śmiało do przodu ide wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.