with updateorcreate update delete create composer php mysql eloquent

php - updateorcreate - mysql trunca entero a un número extraño en buscar e insertar



updateorcreate laravel (3)

Estoy usando Eloquent of Laravel en php para insertar y encontrar un registro. Lo que sucede es que cuando inserto un entero, aquí está -1001094515039, lo cambia a -367135071 y lo almacena en el campo. El tipo de campo es Bigint con 20 caracteres de longitud, he intentado almacenarlo en un campo de tipo texto y Varchar uno, pero sucede lo mismo. Además, cuando cambio manualmente eso a -1001094515039 en phpMyAdmin, y trato de encontrarlo usando el método de búsqueda de Eloquent, ¡no me da ese registro!

El script estaba funcionando en mi primer servidor con PHP 5.X, el servidor actual usa php 7.x, ¡que creo que podría ser el caso! He probado la opción donde establecimos MYSQL_ATTR_MAX_BUFFER_SIZE en 16 * 1024 * 1024, pero eso tampoco funcionó.

Aquí están los valores máximo y mínimo de PHP para int:

min int: -9223372036854775808 max int: 9223372036854775807

Alguna solución?

ACTUALIZAR:

Así es como inserto datos:

$Group = new Group(); $Group->id = -1001094515039; $Group->registerdate = "2017-02-03 00:56:01"; $Group->name = "Test Ginger 2"; $Group->owner_id = 81997375; $Group->save();

var_dump ($ Group-> save ()) El resultado es: http://textuploader.com/d1oo7

Reflejos:

[attributes:protected] => Array ( [id] => -1001094515039 [registerdate] => 2017-02-03 00:56:01 [name] => Test Ginger 2 [owner_id] => 81997375 )

Mostrar Crear resultado de tabla:

CREATE TABLE `groups` ( `id` bigint(20) NOT NULL, `name` varchar(100) CHARACTER SET utf8mb4 NOT NULL, `owner_id` int(11) NOT NULL, `acive` tinyint(1) NOT NULL DEFAULT ''0'', `autorounds` tinyint(1) NOT NULL DEFAULT ''0'', `timezone` varchar(50) NOT NULL DEFAULT ''Pacific/Easter'', `registerdate` datetime NOT NULL, PRIMARY KEY (`id`), KEY `owner_id` (`owner_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1

Resultado del inserto:


¿Qué tipo de datos estás usando para crear ese campo?

Tuve el problema al tratar de insertar un entero grande en un campo int. La solución ha sido alterar el campo para bigint.

Si está utilizando Laravel para sus migraciones, el tipo de datos es:

$table->bigInteger(''votes'');

O en MySQL:

ALTER TABLE table_name MODIFY COLUMN column_name bigint;

Más información sobre los diferentes tipos de enteros. https://dev.mysql.com/doc/refman/5.5/en/integer-types.html


Ahora sospecho que entiendo el problema.

Ejecuté los siguientes var_dumps en una instancia de php 5.5 y una instancia de php 7.0. dd (array (''RawValue'' => -1001094515039), array (''usando intval ()'' => intval (-1001094515039)), array (''Versión PHP'' => phpversion ()));

Aquí están los resultados en:

5.5

array: 1 [▼ "RawValue" => -1001094515039.0] array: 1 [▼ "utilizando intval ()" => -367135071] array: 1 [▼ "PHP Version" => "5.5.12"]

7.0

array: 1 [▼ "RawValue" => -1001094515039] array: 1 [▼ "utilizando intval ()" => -1001094515039] array: 1 [▼ "PHP Version" => "7.0.4"]

Hay más información en este [enlace]: http://php.net/manual/en/function.intval.php , pero sospecho que los cambios en números brutos y enteros en php de 5 a 7 están causando su problema. envolver la variable en un intval () debería resolver su problema.

¡Espero que esto resuelva tu problema!


Aparentemente es un problema relacionado con json en la versión de php 7 que estoy usando. Los datos que estoy insertando en MySql se extraen de la respuesta json que recibo de Telegram.

Y parece que no puede convertir números negativos, porque los enteros sin signo están bien. Ahora agrego la palabra clave (cadena) antes de cualquier posible entero negativo, y el problema está resuelto.

$Group->id = (string) $this->FromChat()->ID;