Esta consulta es de hace 5 años. Tenga eso en cuenta.
nathoo_f13254
nathoo_f13254
España

Estaba recibiendo un extraño mensaje de error derivado...

Estaba recibiendo un extraño mensaje de error derivado de una tabla de un plugin que facturascripts intentaba cambiar constantemente al cargar el modelo.

El tema estaba en el fichero fs_mysql.php , se intentaba hacer un alter table derivado de que el permitir NULL variaba constantemente y luego se intentaba poner a default NULL.

Al final era porque había puesto en el XML en la parte de <NULO> "SI" y hay que poner "YES".

Lo que propongo son dos cosas:

1) Por un lado que se compare con "YES" y con "SI", ya que no es una cosa extraña y puede ocurrir más a menudo de lo que parece
2) Creo que la comparación no se está haciendo bien del todo, puesto que es "if column['is_nullable'] == YES" then... else...
y creo que se debería, o bien poner primero el if column['is_nullable'] == NO o bien en vez de un else un "else if column['is_nullable'] == NO" para que, en caso de que se ponga un valor erróneo que no se meta por esa línea forzando un alter que puede dar problemas. Si el usuario ha puesto <NULO>kk</NULO>, se metería por el NO.
He hecho un parche con las modificaciones propuestas, lo adjunto:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
--- fs_mysql.php 2015-10-08 18:59:02.984063037 +0200
+++ fs_mysql.php.orig 2015-10-08 18:56:03.352070592 +0200
@@ -501,14 +501,12 @@
{
$consulta .= 'ALTER TABLE '.$table_name.' MODIFY `'.$col2['column_name'].'` '.$col2['data_type'];

- if($col2['is_nullable'] == 'YES' || $col2['is_nullable'] == 'SI')
+ if($col2['is_nullable'] == 'YES')
{
$consulta .= ' NULL AUTO_INCREMENT;';
}
- else if($col2['is_nullable'] == 'NO')
- {
+ else
$consulta .= ' NOT NULL AUTO_INCREMENT;';
- }
}
}
else
@@ -518,11 +516,11 @@

if($col2['is_nullable'] != $col['nulo'])
{
- if($col['nulo'] == 'YES' || $col['nulo'] == 'SI')
+ if($col['nulo'] == 'YES')
{
$consulta .= 'ALTER TABLE '.$table_name.' MODIFY `'.$col['nombre'].'` '.$col['tipo'].' NULL;';
}
- else if($col['nulo'] == 'NO')
+ else
$consulta .= 'ALTER TABLE '.$table_name.' MODIFY `'.$col['nombre'].'` '.$col['tipo'].' NOT NULL;';
}

@@ -554,11 +552,11 @@
{
$consulta .= " DEFAULT ".$col['defecto'].";";
}
- else if($col['nulo'] == 'YES' || $col['nulo'] == 'SI'))
+ else if($col['nulo'] == 'YES')
{
$consulta .= " DEFAULT NULL;";
}
- else if($col['nulo'] == 'NO')
+ else
$consulta .= ';';
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

Un saludo
08-10-2015 19:08:10   09-10-2015 00:30:30   24   [NeoRazorX]
He puesto el parche al revés. Ahí va el bueno:

--- fs_mysql.php.orig 2015-10-08 18:56:03.352070592 +0200
+++ fs_mysql.php 2015-10-08 18:59:02.984063037 +0200
@@ -501,12 +501,14 @@
{
$consulta .= 'ALTER TABLE '.$table_name.' MODIFY `'.$col2['column_name'].'` '.$col2['data_type'];

- if($col2['is_nullable'] == 'YES')
+ if($col2['is_nullable'] == 'YES' || $col2['is_nullable'] == 'SI')
{
$consulta .= ' NULL AUTO_INCREMENT;';
}
- else
+ else if($col2['is_nullable'] == 'NO')
+ {
$consulta .= ' NOT NULL AUTO_INCREMENT;';
+ }
}
}
else
@@ -516,11 +518,11 @@

if($col2['is_nullable'] != $col['nulo'])
{
- if($col['nulo'] == 'YES')
+ if($col['nulo'] == 'YES' || $col['nulo'] == 'SI')
{
$consulta .= 'ALTER TABLE '.$table_name.' MODIFY `'.$col['nombre'].'` '.$col['tipo'].' NULL;';
}
- else
+ else if($col['nulo'] == 'NO')
$consulta .= 'ALTER TABLE '.$table_name.' MODIFY `'.$col['nombre'].'` '.$col['tipo'].' NOT NULL;';
}

@@ -552,11 +554,11 @@
{
$consulta .= " DEFAULT ".$col['defecto'].";";
}
- else if($col['nulo'] == 'YES')
+ else if($col['nulo'] == 'YES' || $col['nulo'] == 'SI'))
{
$consulta .= " DEFAULT NULL;";
}
- else
+ else if($col['nulo'] == 'NO')
$consulta .= ';';
}
}
SORRY de nuevo. Está mal el parche, que tiene un paréntesis de más y no carga nada. Va el bueno (espero que ahora sí)

--- fs_mysql.php.orig 2015-10-08 18:56:03.352070592 +0200
+++ fs_mysql.php 2015-10-08 19:13:24.524026806 +0200
@@ -501,12 +501,14 @@
{
$consulta .= 'ALTER TABLE '.$table_name.' MODIFY `'.$col2['column_name'].'` '.$col2['data_type'];

- if($col2['is_nullable'] == 'YES')
+ if($col2['is_nullable'] == 'YES' || $col2['is_nullable'] == 'SI')
{
$consulta .= ' NULL AUTO_INCREMENT;';
}
- else
+ else if($col2['is_nullable'] == 'NO')
+ {
$consulta .= ' NOT NULL AUTO_INCREMENT;';
+ }
}
}
else
@@ -516,11 +518,11 @@

if($col2['is_nullable'] != $col['nulo'])
{
- if($col['nulo'] == 'YES')
+ if($col['nulo'] == 'YES' || $col['nulo'] == 'SI')
{
$consulta .= 'ALTER TABLE '.$table_name.' MODIFY `'.$col['nombre'].'` '.$col['tipo'].' NULL;';
}
- else
+ else if($col['nulo'] == 'NO')
$consulta .= 'ALTER TABLE '.$table_name.' MODIFY `'.$col['nombre'].'` '.$col['tipo'].' NOT NULL;';
}

@@ -552,11 +554,11 @@
{
$consulta .= " DEFAULT ".$col['defecto'].";";
}
- else if($col['nulo'] == 'YES')
+ else if($col['nulo'] == 'YES' || $col['nulo'] == 'SI')
{
$consulta .= " DEFAULT NULL;";
}
- else
+ else if($col['nulo'] == 'NO')
$consulta .= ';';
}
}
Puedes hacer un fork del proyecto, en tu fork subir los cambios, y hacer un pull request al proyecto principal.

Viene a hacer lo mismo que has hecho pegándolo aquí, pero el código es usable directamente sin el trabajo adicional que te has llevado;)
ok


Copyright (c) 2013-2020 FacturaScripts