Problema consulta PHP-MYSQL con variable.

Kandelario

Modifico #1 ya que se han hecho "avances".

No puedo trabajar con los datos insertados por PHP en SQL por que son datos leídos de un .txt y me lo inserta tal que así (unos son los valores insertados desde php y otros a mano):

Ahora tengo que hacer del txt creado con powershell que estén todas las salidas en una línea separados por un ";" por ejemplo, no he sido capaz de hacerlo.

New-Item C:\temp\test.txt

Set-Content C:\temp\test.txt (Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum | Foreach {"{0:N2}" -f ([math]::round(($_.Sum / 1GB),2))}) 

Add-Content C:\temp\test.txt (Get-CimInstance -ClassName Win32_Processor).name 

Add-Content C:\temp\test.txt (Get-WmiObject Win32_OperatingSystem).caption 

Add-Content C:\temp\test.txt (Get-CimInstance -ClassName Win32_VideoController).name 
Sust0

No estoy muy puesto en php pero diría que el primer problema es que estás haciendo un insert para cada valor en vez de un insert con todos los valores. Si no quieres hacer un insert con todos los valores de golpe pues supongo que tendrás que recuperar la id del primer insert que hagas y guardarla para cuando vayas a insertar los siguientes valores.

En el segundo problema es posible que la query esté mal?

SELECT valor FROM ram_juegos WHERE '$ram' = 'ram'

Yo diría que debería ser así:

SELECT valor FROM ram_juegos WHERE 'ram' = '$ram'

1 respuesta
Kandelario

#2 Al final la segunda query no está mal, que igual si lo estaba pero la he corregido, igualmente me está dando mal royo por que hago un select * from ram_juegos y le asigno una variable a cada columna.

Me salen todos los resultados bien, y por el medio meto un if de comprobación a la variable de salida de la consulta que en un momento determinado es un 8,00 y la compruebo con mi variable de sesión $ram que también es 8,00 y NO ME DICE QUE SON IGUALES XD.

2 respuestas
Sust0

#3 Pasa la información de la tabla ram_juegos, porque si te dice que 8,00 no es igual a 8,00 creo que es obvio dónde está el problema.
Una string nunca será igual a un int aunque a tus ojos tengan el mismo valor. Uno de los dos es un String y tendrás que parsearlo a int antes de compararlos supongo, lo cual me lleva a otra cuestión, y es que juraría que en php los floats son "8.00" a lo cual me lleva a otra cuestión, de por qué para referirte a ram usas decimales si diría que siempre son valores enteros desde hace décadas (64mb, 128mb, 256mb, 512mb, 1gb, 2gb, 4gb, 8gb, 16gb)... el único caso que recuerdo es el de los 3.5gb de la geforce 970 me parece.

1 respuesta
Kandelario

#4 La columna "ram" de la tabla ram_juegos es un varchar.

Y se está comparando con una variable de sesión que es una consulta a otra tabla de la base de datos donde su columna también es un varchar.

Se están comparando dos varchars iguales y no funciona -ya los comprobé a parte con el isint-.

Además, el script que tengo solo saca los valores de la ram tal que 4,00 8,00 16,00 18,00 y eso es lo que yo meto en las tablas, si fueran INT ni te dejaría meterlo ya que lo he intentado.

Pero bueno eso no tiene importancia.

Es por esa razón que dependo de los valores que tienen asignados los campos 4,00 8,00 16,00 18,00, para poder comparar de alguna forma con la especificación del juego en cuestión, que en sus valores de ram por ejemplo tiene 1, 2, 3 o 4.

1 respuesta
B

El principal problema es que cada resultado del TXT, te lo está guardando como si fuera una línea independiente y no todas juntas.
Lo que veo es que no hagas un parser correcto al leer el TXT ya sea usando ";" o ":" o lo que uses de separador para los componentes.

Ahí ya tendrías que coger cada línea y separarla en piezas de tal manera que cada una de las piezas corresponda a RAM, CPU, SO y GPU.
Y mientras el archivo tenga líneas, hacer los INSERT en la Base de Datos.

Lo que deberías hacer primero es ver como te muestra el array $rowData y no tanto lio con si Ram, Si Valor.

Haz un print_r($array)

print("<pre>".print_r($array_data,true)."</pre>");

Algo así sustituyendo el array por el tuyo para que se muestre como lo está parseando.

Si no te salen iguales es porque no lo son y si te pilla campos vacíos pues con más diferencia.

2 respuestas
Sust0

#5 Has probado en el último if de #3 a usar "==="?
Usa el gettype() con $var2 y $ram a ver qué te dice xD.

1 respuesta
Kandelario

#6 Si te soy sincero no he hecho lo del parser por que no he sido capaz de hacer que el script lo ponga al final de cada comando, bueno ni al final ni en ningún sitio xd.

Ahora pruebo a hacer lo que me dices, a ver si soy capaz, que se de PHP lo que he buscado por internet para hacer este proyecto.

Kandelario

#6 Te refieres a esto?

1 respuesta
Kandelario

#7 No hace nada con el === y con el gettype me da las dos variables string.

Seguramente tiene que ver con que el código es una puta mierda que flipas pero joder tampoco será para esto no?xd

Si os sentís motivados os lo subo por ahí para que podáis tocatear, aun que lo dudo mucho.

B

#9 quita el while y haz un print_r a $resultado

Esa tabla sólo tiene 2 campos. Tienes que hacer el print_r cuando insertas la del txt de gpu, cpu y demás

2 respuestas
Kandelario

#11 mysqli_result Object ( [current_field] => 0 [field_count] => 2 [lengths] => [num_rows] => 4 [type] => 0 )

Kandelario

#11 En qué momento? No entiendo lo del print_r si lo meto en la tabla con un

$sql = "INSERT INTO comparar (ram) VALUES ('$line')";
$conn->query($sql);

B

Tienes 2 tablas que yo vea, una que tiene los valores de RAM y Valor
Otra que es la que parsea los datos del TXT y es la que te genera diferentes líneas para cada resultado que lee.

Lo primero es arreglar la tabla que recoge los resultados del TXT y para ello, tienes que ver como está parseando los resultados "ANTES" de meterlos en la tabla.

NO necesitas hacer 3 inserts por cada campo de la tabla, pues te va a crear un nuevo registro por cada uno de ellos y si además habrás puesto que puedan ser nulos. Ahí tienes el problema de que en cada línea de la tabla, tengas un resultado correspondiente a RAM, CPU, SO y GPU.
Para ello lo que haces es en la misma secuencia del INSERT, meter todos los datos. Ya estén rellenados o nulos.

Esto hará que cada ordenador de cada usuario esté registrado en su correspondiente línea.

Cuando tienes esto arreglado, lo que tienes que hacer es un JOIN entre tablas y comparar valores iguales.
Asumo que nos falta una tercera tabla en la que marca el juego al que quiere jugar.

Entonces para este caso sería.

1- Buscar el juego en la tabla
2- Buscar la RAM que usa ese juego
3- Comparar este resultado con la RAM de la tabla que aloja el pc del usuario
4- Mostrar el resultado.

Punto 1 y 2 pueden estar en la misma tabla o en diferentes. Aquí como la tengas. Es añadir otra secuencia SQL adicional para la relación entre ellas.

1 2 respuestas
Kandelario

#14 Muchísimas gracias, mañana le daré caña a ver si lo dejo medio resuelto que hoy llevo desde las 6 de la tarde o así y veo doble.

Kandelario

#14 #14 He arreglado lo de la inserción de datos en la tabla.

Pero sigo sin saber por qué no me retorna nada de la tabla comparar cuando sí lo hace con otra tabla que tiene el mismo varchar que la tabla comparar, eso sí, el valor de la tabla que si me lo coje no está insertado desde PHP.

Ahora que lo pienso, esa tabla lleva unos cuantos "delete from comparar; truncate comparar" puede ser que por ahí venga el error?
Si es así no debería pillarme nada con el select * from comparar no?

PD; Acabo de meter valores desde phpmyadmin a la misma tabla y eso si que puedo recuperarlo.

B

Tienen las 2 tablas el mismo UTF-8?. El signo de la coma puede afectar a la búsqueda. Incluso si estás usando un motor diferente.

Mira a ver si estás usando innodb en las dos tablas o Maria.

1 respuesta
Kandelario

#17 No tiene nada que ver, he creado de nuevo la tabla, he insertado los datos desde PHP y en la consulta no me devuelve nada. La vacío, inserto los mismos datos a mano, y si que me devuelve valores.

Por algún motivo no puedo trabajar con los datos insertados desde PHP, a ver si encuentro algo pero lo veo crudo xD.

B

Mira de convertir esos valores a string antes de insertarlos en la tabla. A ver si los está metiendo como int

1 respuesta
Kandelario

#19 Son todos tipo string, estoy buscando mi problema por otros lares y 0 resultados xD

Me voy a poner con otras cosas y ya le preguntaré a algún profe por que esto no tiene ningún sentido aun que no creo que sepan ayudarme.

1 respuesta
B

#20 Cambia la comma en el TXT cuando importas el archivo, para eliminar que esta pueda ser la causa. Intenta un Punto.

1 respuesta
Kandelario

#21 No se a dónde te refieres.

B

Muestra como están los datos en el txt

1 respuesta
Kandelario

#23

B

Puede ser que te esté añadiendo bytes basura y por eso 8,00 no sea lo mismo metiendo tu a mano el valor que desde php.

Intenta crear un txt que sea todo en una misma linea

8,00;Intel(R) Core(TM) i5-8600K CPU @ 3.60GHz;Microsoft Windows 10 Pro;Nvidia GeForce GTX 1060 3GB;

Y parseas los datos haciendo las separaciones entre las ";" siendo 4 el valor para cada línea dentro de la base de datos.
Si hay un valor nulo o faltante, aparecerán 2 ;; seguidas

Así una búsqueda rápida en Stackoverflow en Español
https://es.stackoverflow.com/questions/294803/buscar-datos-de-un-txt-en-array-y-actualizar

No es lo que buscas completamente pero te puede orientar, en su caso está parseando los datos usando '|' entre diferentes valores.
Con esto cada texto entre ; o | pertenecerá a uno de los campos con lo que lo separas en variables o en un array con su indice correspondiente y puedes crear un Insert dentro de la tabla.

2 respuestas
Kandelario

#25 Pues si es eso me cago en su puta madre la verdad, pero se tendrá que intentar.

A ver si soy capaz de hacerlo xd

-Yepeto-

Prueba a hacer un Like que solo incluya la primera cifra numérica y ver si falla cuando llegas a la coma.

1 respuesta
Kandelario

#27 También probé el like con las distintas columnas de la tabla y nada.

Kandelario

#25 De momento no soy capaz de poner un ; al final de cada línea en powershell...

Igualmente he intentado otro código para leer el txt y meterlo en la base de datos y me pasa lo mismo.

Lo he mirado de este pavo que está leyendo un txt sin ningún tipo de delimitador al final de cada línea y tampoco me funciona.

Aquí el .txt del tipo:

1 respuesta
B

#29 No necesitas un ; al final de la línea cuando sólo vas a meter los datos de un único insert.

Ponlo sin el. Fíjate que su TXT su delimitador es la comma

Digo ; "punto y coma" o "|" por ser algo que no puedan meter tus usuarios de normal en lo del pc. Al final de la línea no metas nada.

Sobre el minuto 10, verás como recoge todos los datos en variables y luego hace un INSERT conjunto.

2 respuestas

Usuarios habituales