Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [yii] PHP notice Undefined variable
Marek607
post 5.01.2014, 14:56:43
Post #1





Grupa: Zarejestrowani
Postów: 42
Pomógł: 3
Dołączył: 4.03.2010

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Marek607 5.01.2014, 14:58:08
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
Turson
post 5.01.2014, 15:03:47
Post #2





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


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();


Ten post edytował Turson 5.01.2014, 15:06:52
Go to the top of the page
+Quote Post
Marek607
post 5.01.2014, 15:14:57
Post #3





Grupa: Zarejestrowani
Postów: 42
Pomógł: 3
Dołączył: 4.03.2010

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Marek607 5.01.2014, 15:17:37
Go to the top of the page
+Quote Post
Turson
post 5.01.2014, 15:27:10
Post #4





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


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

Ten post edytował Turson 5.01.2014, 15:27:38
Go to the top of the page
+Quote Post
tomxx
post 5.01.2014, 16:57:18
Post #5





Grupa: Zarejestrowani
Postów: 172
Pomógł: 27
Dołączył: 5.10.2013

Ostrzeżenie: (0%)
-----


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')


Ten post edytował tomxx 5.01.2014, 16:58:13
Go to the top of the page
+Quote Post
Turson
post 5.01.2014, 17:10:50
Post #6





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


Zamiast wygłuszać błędy to lepiej isset jak z resztą podałem w kodach wyżej.
Go to the top of the page
+Quote Post
Marek607
post 5.01.2014, 18:25:08
Post #7





Grupa: Zarejestrowani
Postów: 42
Pomógł: 3
Dołączył: 4.03.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 03:50