model diversi!?!?!? stesso codice ma != versione di php

la sostanza è questa: ho realizzato questo sitino con yii e poi l’ho pubblicato. La differenza tra la mia macchina e quella online, è che da me c’è ubuntu 10.04 e li c’è la 6.06. Da me php 5.3.2 li php 5.1.2.

Ho fatto un var_dump($model); ed ottengo due risultati differenti tra il mio pc e quello in produzione. Il problema è saltato fuori quando non mi era possibile fare l’upload di immagini. Prima era un problema di GD, poi risolto. Andando a caccia del problema, ho visto che da me il nome dell’immagine viene salvato, ma online per ragioni che ignoro NO!

Ne consegue che se tento di fare l’upload di una immagine nel codice


Image_GD_Driver::process($image, $actions, $dir, $file, $render = FALSE)

la variabile $file è VUOTA! O meglio equivale ad Object#45 … … . il 45 l’ho messo a caso. Il concetto è che nel mio PC non mi da Object ma CUploadedFile. In sostanza, da qualche parte il model si dimentica di che cos’è!?! Dico bene?

In oltre vi posto quello che si vede dal mio portatile dopo aver modificato CActiveRecord::model() in questo modo:

(Ho solo aggiunto un vardump)




  public static function model($className=__CLASS__) {

    if (isset(self::$_models[$className])) {

      return self::$_models[$className];

    } else {

      $model = self::$_models[$className] = new $className(null);

      var_dump($model);

      $model->_md = new CActiveRecordMetaData($model);

      $model->attachBehaviors($model->behaviors());

      return $model;

    }

  }






object(Automobili)#20 (13) {

["immagine"]=> NULL 

["_md":"CActiveRecord":private]=> NULL 

["_new":"CActiveRecord":private]=> bool(false) 

["_attributes":"CActiveRecord":private]=> array(0) { } 

["_related":"CActiveRecord":private]=> array(0) { } 

["_c":"CActiveRecord":private]=> NULL 

["_pk":"CActiveRecord":private]=> NULL 

["_alias":"CActiveRecord":private]=> string(1) "t" 

["_errors":"CModel":private]=> array(0) { } 

["_validators":"CModel":private]=> NULL 

["_scenario":"CModel":private]=> string(0) "" 

["_e":"CComponent":private]=> NULL 

["_m":"CComponent":private]=> NULL }



e quello che si vede online:


object(Automobili)#19 (13) { 

["immagine"]=> NULL 

["_md:private"]=> NULL 

["_new:private"]=> bool(false) 

["_attributes:private"]=> array(0) { } 

["_related:private"]=> array(0) { } 

["_c:private"]=> NULL 

["_pk:private"]=> NULL 

["_alias:private"]=> string(1) "t" 

["_errors:private"]=> array(0) { } 

["_validators:private"]=> NULL 

["_scenario:private"]=> string(0) "" 

["_e:private"]=> NULL 

["_m:private"]=> NULL }

ciao, ma hai provato in locale con php 5.1.2? potrebbe essere un problema in include.

Anche yii/framework l’hai incluso in modo corretto?

altro non mi viene in mente

Ho copiato tutto il mio codice in produzione. Non ho differenze. Sia il framework che il sito sono presi pari pari da ciò che è nella mia macchina.

Ti spiego tutta la storia: questo sito ha un form per fare l’upload di immagini. Lo provo, funziona … quindi sviluppo tutto il sito e lo metto in produzione. Poi scopro che viene generata un’eccezione perchè le librerie GD mancano. Installiamo anche quelle. Sono andato dentro al framework a fare diversi var_dump e scopro che ad un certo punto si perde il nome del file.

Al momento attuale, viene salvato un file vuoto “Object# 44” per si perde il riferimento al file. Oltretutto, viene generata un’eccezione non prevista.

Si: ho dimenticato di dirti che effettivamente stiamo creando un’altra macchine con le stesse configurazioni che sono in produzione.

Ciao Sensoraio.

Hai controllato in remoto il file php.ini sia adeguatamente configurato ?

file_uploads = On

Controlla anche le seguenti variabili se puoi:

-max upload filesize

-max post data size

-memory limit

-upload_tmp_dir

Purtroppo si =(. Temo che farò una cosa cattiva cattiva: bypasserò quel componente e farò il lavoro sporco a mano. Farò altre prove comunque e magari isolerò l’esempio e condividerò il codice con chi ne volesse analizzare i contenuti.

Essendo capitato solo a me credo sia colpa di qualche riga di codice avventata.

Non credo che il problema sia nell model diverso che hai postato sopra… perche i valori sono gli stessi… solo la rapresentazione e diversa…

Deve eserci un altro motivo… dovresti analizare il codice che popola la $file…

Se serve… sono sepre a disposizione per fare un po di debug ;)

Non sono ancora riuscito a fare debug =(. Non arrivo a configurare il mio Netbeans. Se mi dai una manina mdomba te ne sarei grato!

Certamente…

Per poter fare debug dal NetBeans… si deve installare xdebug - http://www.xdebug.org/

Qui che un NetBeans wiki - http://wiki.netbeans.org/HowToConfigureXDebug

Se hai problemi… chiedi qui… :)

Per intanto comunico la mia soluzione accrocchio:




  public function actionCreate() {

    $model = new Automobili;

    if (isset($_POST['Automobili'])) {

      $model->attributes = $_POST['Automobili'];

      if ($model->save()) {

        if ($model->immagine != "") {

          $model->immagine = CUploadedFile::getInstance($model, 'immagine');

          $model->immagine->saveAs(Yii::app()->basePath . "/../images/" . ($_FILES["Automobili"]["name"]["immagine"]));

          $image = Yii::app()->image->load(Yii::app()->basePath . "/../images/" . ($_FILES["Automobili"]["name"]["immagine"]));

          $image->resize(179, 179);

          $image->save();

        }

        $model->immagine = @$_FILES["Automobili"]["name"]["immagine"];

        $model->save();

        $this->redirect(array('view', 'id' => $model->id));

      }

    }

    $this->render('create', array(

        'model' => $model,

    ));

  }


  public function actionUpdate($id) {

    $model = $this->loadModel($id);

    if (isset($_POST['Automobili'])) {

      if (CUploadedFile::getInstance($model, 'immagine') != "") {

        $model->immagine = CUploadedFile::getInstance($model, 'immagine');

        $model->immagine->saveAs(Yii::app()->basePath . "/../images/" . (@$_FILES["Automobili"]["name"]["immagine"]));

        $image = Yii::app()->image->load(Yii::app()->basePath . "/../images/" . (@$_FILES["Automobili"]["name"]["immagine"]));

        $image->resize(179, 179);

        $image->save();

      }

      if ($model->save()) {

        $model->immagine = @$_FILES["Automobili"]["name"]["immagine"];

        $model->save();

        $this->redirect(array('view', 'id' => $model->id));

      }

    }

    $this->render('update', array(

        'model' => $model,

    ));

  }



Come vedete, il componente salva correttamente ma, per ragioni che non so spiegarmi … perde il nome dell’immagine. La mia soluzione è che, dopo l’insert e l’update, sovrascrivo il valore di $model->immagine con @$_FILES[“Automobili”][“name”][“immagine”]. (scusate il silent … si poteva fare di meglio ma sto problema mi ha fatto andare via di testa).

Lo so sono un maiale. Ma ai maiali che risolvono i problemi bisogna volergli bene dai =).

Io uso sempre una variabile temporanea per esempio


$img=CUploadedFile::getInstance(...)

e poi


$model->imagine=$img->name;