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
¿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;