SQL Error

Ciao a Tutti,

Sto seguendo il tutorial su Akrabat, ma ho un problemino

quando faccio insert() o update() dei dati.

Se inserisco la à (a accentata) come lettera finale o singola all'interno del form,

ricevo questo errore:

SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xC3' for column 'title' at row 1

Se metto altre lettere accentate non ho problemi.

Cosa ne pensate?

Ho settato tutte le codifiche UTF-8 (come sempre)

le Collation a utf8_general_ci (come sempre)

Uso ZendServer CE in locale (da poco e forse qui c'è il problema)

Ho provato a metterlo anche su uno spazio web che ho

e online funziona perfettamente (giustamente)

C'è qualche settaggio che mi sfugge.

Grazie del supporto e complimenti per il Forum

inviato 6 anni fa
ametris
X 0 X

Puoi farci vedere il codice che riceve i dati?

Ma sei sicuro che il problema è circoscritto alla "à" (a accentata) e a nessun altro carattere?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Grazie mille per l'interessamento MarioS,

Allora:

è assurdo ma il problema è solo con le à, :(

e solamente se è la lettera finale della stringa (peggio ancora), >:(

ripeto in remoto su uno spazio che ho online va alla grande.

Form

class Form_Album extends Zend_Form 
{
   public function init()
   //public function __construct($options = null) 
   {
      //parent::__construct($options);
      $this->setName('album');
      
      $id = new Zend_Form_Element_Hidden('id');
      
      $artist = new Zend_Form_Element_Text('artist');
      $artist->setLabel('Artista')
            ->setRequired(true)
            ->addFilter('StripTags')
            ->addFilter('StringTrim')
            ->addValidator('NotEmpty');
      $artist->getValidator('NotEmpty')->setMessage('Artista non può essere vuoto');
      
      $title = new Zend_Form_Element_Text('title');
      $title->setLabel('Titolo')
            ->setRequired(true)
            ->addFilter('StripTags')
            ->addFilter('StringTrim')
            ->addValidator('NotEmpty');
      $title->getValidator('NotEmpty')->setMessage('Titolo non può essere vuoto');
            
      $submit = new Zend_Form_Element_Submit('submit');
      $submit->setAttrib('id','submitbutton');
      
      $this->addElements(array($id,$artist,$title,$submit));
            
   }
}

models/DbTable

class Model_DbTable_Albums extends Zend_Db_Table_Abstract 
{
   
   protected $_name = 'albums';
   
   public function getAlbum($id) 
   {
      $id = (int)$id;
      $row = $this->fetchRow('id ='. $id);
      
      if (!$row) 
      {
         throw new Exception("Non trovo la riga $id") ;
      }
      
      return $row->toArray();
   }
   
   public function addAlbum($artist,$title) 
   {
      $data = array(
         'artist' => $artist,
         'title' => $title,
      );
      $this->insert($data);
   }
   
   function updateAlbum($id,$artist,$title) 
   {
      $data = array(
         'artist' => $artist,
         'title' => $title,
      );
      $this->update($data, 'id='.(int)$id);
   }
   
   function deleteAlbum($id) 
   {
      $this->delete('id ='. (int)$id);
   }
   
}

IndexController

class IndexController extends Zend_Controller_Action
{

    public function init()
    {
        /* Initialize action controller here */
    }

    public function indexAction()
    {
        $this->view->title = "Il Mio Album";
        $this->view->headTitle($this->view->title, 'PREPEND');
        
        $albums = new Model_DbTable_Albums();
        $this->view->albums = $albums->fetchAll();
    }

    public function addAction()
    {
          $this->view->title = "Aggiungi un Album";
          $this->view->headTitle($this->view->title, 'PREPEND');
          
          $form = new Form_Album();
          $form->submit->setLabel('Add');
          $this->view->form = $form;
          
          if ($this->getRequest()->isPost()) 
          {
             $formData = $this->getRequest()->getPost();
             if ($form->isValid($formData)) 
             {
                $artist = $form->getValue('artist');
                $title = $form->getValue('title');
                
                $albums = new Model_DbTable_Albums();
                $albums->addAlbum($artist,$title);
                
                $this->_redirect('/');
             }else {
                 $form->populate($formData);
                   }
          }      
    }

    public function editAction()
    {
        $this->view->title = "Modifica l'Album";
        $this->view->headTitle($this->view->title, 'PREPEND');
        
        $form = new Form_Album();
        $form->submit->setLabel('Save');
        $this->view->form = $form;
        
        if ($this->getRequest()->isPost()) 
        {
           $formData = $this->getRequest()->getPost();
           
           if ($form->isValid($formData)) 
           {
              $id = (int)$form->getValue('id');
              $artist = $form->getValue('artist');
              $title = $form->getValue('title');
              
              $albums = new Model_DbTable_Albums();
              $albums->updateAlbum($id,$artist,$title);
              
              $this->_redirect('/');
           }else {
              $form->populate($formData);
                }
        }else {
           $id = $this->_getParam('id',0);
           
           if ($id>0) 
              {
               $albums = new Model_DbTable_Albums();
               $form->populate($albums->getAlbum($id));
              }
              }
    }

    public function deleteAction()
    {
        $this->view->title = "Cancella Album";
        $this->view->headTitle($this->view->title, 'PREPEND');
        
        if ($this->getRequest()->isPost()) 
        {
           $del = $this->getRequest()->getPost('del');
           if ($del=='Yes') 
           {
              $id = $this->getRequest()->getPost('id');
              $albums = new Model_DbTable_Albums();
              $albums->deleteAlbum($id);
           }
           $this->_redirect('/');
           
        }else {
           $id = $this->_getParam('id',0);
           $albums = new Model_DbTable_Albums();
           $this->view->album = $albums->getAlbum($id); 
            }

    }
}

Che cosa ne pensi?

risposto 6 anni fa
ametris
X 0 X

Il codice è php è corretto, per convertire i caratteri accentati eccetera in codice html aggiungi un filtro:

->addFilter('HtmlEntities')

MySql di base usa latin swedish come collation, stai comunicando con il db tramite la codifica che hai impostato?

Ne sei certo?

Con phpMyAdmin (o il client che usi) porta il database a latin1_swedish_ci e anche la collation di mysql.

Riprova.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Solitamente imposto tutto su UTF-8

MySql, PhpMyAdmin collation.... per evitare appunto questi problemi di codifica.

Considera che se aggiungo a mano il testo in PhpMyAdmin poi lo legge bene,

ti posso dare un'altra indicazione:

quando invio un solo campo del form e quindi ricevo l'errore che l'altro è vuoto

mi trasforma la lettera à accentata (solo se è l'ultima) in un quadrato come per i caratteri cinesi per intenderci

Che ne pensi?

ora comunque provo ad aggiungere il filtro e ti dico

risposto 6 anni fa
ametris
X 0 X

Provato,

ma ora mi da:

SQLSTATE[HY000]: General error: 1406 Data too long for column 'artist' at row 1

e i campi sono settati come varchar(100)

risposto 6 anni fa
ametris
X 0 X

Ti invio anche questo:

Message: SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xC3' for column 'title' at row 1 

Stack trace:
#0 C:\Users\adriano\Documents\Zend\Framework-Version\ZendFramework-1.9.6\ZendFramework-1.9.6\library\Zend\Db\Statement.php(300): Zend_Db_Statement_Pdo->_execute(Array)
#1 C:\Users\adriano\Documents\Zend\Framework-Version\ZendFramework-1.9.6\ZendFramework-1.9.6\library\Zend\Db\Adapter\Abstract.php(468): Zend_Db_Statement->execute(Array)
#2 C:\Users\adriano\Documents\Zend\Framework-Version\ZendFramework-1.9.6\ZendFramework-1.9.6\library\Zend\Db\Adapter\Pdo\Abstract.php(238): Zend_Db_Adapter_Abstract->query('UPDATE `albums`...', Array)
#3 C:\Users\adriano\Documents\Zend\Framework-Version\ZendFramework-1.9.6\ZendFramework-1.9.6\library\Zend\Db\Adapter\Abstract.php(604): Zend_Db_Adapter_Pdo_Abstract->query('UPDATE `albums`...', Array)
#4 C:\Users\adriano\Documents\Zend\Framework-Version\ZendFramework-1.9.6\ZendFramework-1.9.6\library\Zend\Db\Table\Abstract.php(1113): Zend_Db_Adapter_Abstract->update('albums', Array, 'id=5')
#5 C:\Program Files\Zend\Apache2\htdocs\adam\application\models\DbTable\Albums.php(35): Zend_Db_Table_Abstract->update(Array, 'id=5')
#6 C:\Program Files\Zend\Apache2\htdocs\adam\application\controllers\IndexController.php(67): Model_DbTable_Albums->updateAlbum(5, 'Kings of Leon', 'Only By The Nig...')
#7 C:\Users\adriano\Documents\Zend\Framework-Version\ZendFramework-1.9.6\ZendFramework-1.9.6\library\Zend\Controller\Action.php(513): IndexController->editAction()
#8 C:\Users\adriano\Documents\Zend\Framework-Version\ZendFramework-1.9.6\ZendFramework-1.9.6\library\Zend\Controller\Dispatcher\Standard.php(289): Zend_Controller_Action->dispatch('editAction')
#9 C:\Users\adriano\Documents\Zend\Framework-Version\ZendFramework-1.9.6\ZendFramework-1.9.6\library\Zend\Controller\Front.php(946): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#10 C:\Users\adriano\Documents\Zend\Framework-Version\ZendFramework-1.9.6\ZendFramework-1.9.6\library\Zend\Application\Bootstrap\Bootstrap.php(77): Zend_Controller_Front->dispatch()
#11 C:\Users\adriano\Documents\Zend\Framework-Version\ZendFramework-1.9.6\ZendFramework-1.9.6\library\Zend\Application.php(358): Zend_Application_Bootstrap_Bootstrap->run()
#12 C:\Program Files\Zend\Apache2\htdocs\adam\public\index.php(26): Zend_Application->run()
#13 {main}  

Request Parameters:
array (
  'controller' => 'index',
  'action' => 'edit',
  'id' => '5',
  'module' => 'default',
  'artist' => 'Kings of Leon',
  'title' => 'Only By The Night à',
  'submit' => 'Save',
) 

Come puoi vedere in Request Parameter il Title ha una "à" alla fine

risposto 6 anni fa
ametris
X 0 X

Temo sia un problema appunto di codifica dei caratteri e di collation...ma le hai convertite?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

si convertite, ma niente da fare

risposto 6 anni fa
ametris
X 0 X

io sto pensando a qulache bug,

perchè ha sempre funzionato tutto e solo da quando ho installato ZendServer ho questo assurdo problema.

Tu lo usi?

risposto 6 anni fa
ametris
X 0 X

Sto su server Linux, non windows e non uso Zend Server.

Il problema risiede comunque nel database e nella sua comunicazione, problemi di codifica dei caratteri, su questo non ci piove.

Può essere che sia "danneggiata" la versione di MySql rilasciata con Zend Server...

risposto 6 anni fa
Mario Santagiuliana
X 0 X

è un idea provo a reinstallarla

risposto 6 anni fa
ametris
X 0 X

dici che apache non c'entra niente?

Perchè come ti accennavo prima se invio il form con un solo campo pieno (sempre con la à finale) e l'altro vuoto mi da l'errore php che ho inserito io per i campi vuoti e mi trasforma la lettera da accentata à a ? (quadrato) e in questo caso non penso che siamo passati per MySql (o sbaglio)?

risposto 6 anni fa
ametris
X 0 X

Quello è un altra cosa, ti restituisce il carattere strano perchè non hai trasformato il carattere accentato in un codice html oppure non hai impostato la codifica corretta alla tua pagina html in modo tale che il browser interpreti il carattere accentato e lo visualizzi come tale.

Sono due problemi separati.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Ok Chiaro

anche se anche li la codifica nella pagina è UTF-8

risposto 6 anni fa
ametris
X 0 X

Dipende da come imposti il charset nel tuo head...comunque in una pagina html è meglio usare sempre i codici html...

risposto 6 anni fa
Mario Santagiuliana
X 0 X

$view->headMeta()->appendHttpEquiv("Content-Type", "text/html; charset=UTF-8");

giusto no?

risposto 6 anni fa
ametris
X 0 X

Si esatto, se però poi viene cambiata la codifica salta fuori il problema...

Allora potrebbe trattardi di apache-php che vanno a modificare la cosa, per questo è meglio usare i caratteri html.

ciao

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Scusa, per html intendi inserire direttamente il codice HTML nel Layout senza settarlo nel Bootstrap

come ViewHelpers?

risposto 6 anni fa
ametris
X 0 X

No usi il filtro htmlentities come ti ho detto prima per esempio.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

se uso htmlentities mi da la lettera accentata come entità html sia in PhpMyAdmin che come output nella pagina web anche quando ho cambiato la collation addirittura ho cancellato il DB e ricreato tutto con le collation da te consigliate

risposto 6 anni fa
ametris
X 0 X

Si infatti...se vuoi mantenere il carattere così com'è devi controllare anche la codifica di apache allora...

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Ti faccio ridere Mario?  ;)

Bhè ieri ho provato a installare e disinstallare diverse volte ZendServer Wamp ecc...

con diverse configurazioni in particolare su i charset...

Ma non cambiava mai nulla.

Oggi ho provato una modifica perchè mi era venuto un dubbio e sai la cosa strana...

ho commentato 

//->addFilter('StringTrim')

e non mi fa più storie con la lettera à accentata

se decommento di nuovo il filtro ecco il problema

Interessante vero...Che ne pensi?

risposto 6 anni fa
ametris
X 0 X

Ma perchè lo dovrebbe fare???  :( :(

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Ma tu lo hai capito..

Quindi nemmeno tu hai un idea?

Ho solo aggiunto a quello che ti ho detto prima:

resources.db.params.driver_options.1002 = SET NAMES UTF8;

nel application.ini

in questo modo vedo le lettere accentate corrette in HTML e in DB tramite PhpMyAdmin

Per il filtro nessuna idea?

ripeto naturalmente funzionava con tutte le accentate

tranne la à e online benissimo con filtro stringTrim su uno spazio linux

 

risposto 6 anni fa
ametris
X 0 X

Per me è una situazione troppo strana e mi puzza di bug.

Proverei a segnalarlo agli sviluppatori.

Ciao

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Ho scaricato l'ultima versione del Framework e ora l' errore è cambiato:

se aggiungo la à alla fine della parola mi da l'errore di campo vuoto visto che c'è anche

->addValidator('NotEmpty');

Ho risolto al momento così:

->addFilter('StringTrim','UTF-8')

in questo modo il dato inserito via form passa e viene visualizzato correttamente altrimenti NO.

Inoltre ho aggiunto in application.ini:

resources.db.params.charset = utf8

cosi viene salvato il carattere accentato correttamente anche nel DB

Sempre più strano, comunque mi sembra ovvio che sia un problema di codifica con stringTrim

cosa ne pensate?  ::)

risposto 6 anni fa
ametris
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda