3

hola que tal amigos soy nuevo en esto de la programacion y estoy haciendo un pequeño sistema de stock para practicar y tengo el siguiente problema. Las "ñ" en el navegador me las muestra con un signo "?", tengo el en todas las paginas y no se como arreglarlo he visto las respuestas de todas las preguntas sobre el tema en el foro pero ninguna me ha funcionado, lo mas raro es que el mismo codigo y la misma base de datos me funciona bien en otra computadora. alguno me podria ayudar? adjunto los codigos

function ShowTable (){          

 require("conexion.php");
    $con=conectar();
    $sql="SELECT idProd,nombreProd,stockProd,accion FROM productos";
    $stmt= $con-> prepare($sql);
    $result = $stmt->execute();
    $rows= $stmt->fetchAll(\PDO::FETCH_OBJ);

    foreach ($rows as $row ) { 

        $id=$row->idProd;

        ?>

            <tr>

                <td><?php echo($row->nombreProd); ?></td>

                <?php
                    if ($row->stockProd<10) {?>
 <td style="color: red"><?php echo(utf8_encode($row-  >stockProd)); ?> </td>


                        <?php }
                     else {?>

                        <td><?php echo(utf8_encode($row->stockProd)); ?> 
                       </td>


                    <?php } ?>


                        <td colspan="2" align="center">
 <a href="editar.php?p=<?php echo $id ?>&q=editar" class="btn">Editar</a>
 <a href="botones.php?p=<?php echo $id ?>&q=eliminar" class="btn">Eliminar
 </a>
                        </td>


            </tr>

            <?php
            }

}
mariano1424
  • 113
  • 1
  • 10
  • 3
    Pon esto antes de la variable `$sql`: **`$con->exec("set names utf8");`**. Si no funciona, pon también un meta utf-8 en el HTML. [Aquí hay una respuesta detallada sobre ese problema en general](https://es.stackoverflow.com/a/59510/29967) y sobre malas prácticas, como aplicar codificación a medio camino con `utf8_encode`, lo cual, como demuestra tu caso, sirve de poco. Hay que atacar el problema **en la raíz**, estableciendo codificación adecuada en los diferentes niveles. – A. Cedano Apr 03 '18 at 00:21
  • Pregunta, los caracteres los visualizas mal en el navegador unicamente o tambien en el gestor de BD – Ricardo D. Quiroga Apr 03 '18 at 16:42

4 Answers4

3

Puede que sea que te falte la codificación en el HEAD de la página donde quieres pintarla:

<meta charset="utf-8" /> 

Es una hipótesis.

Sergio Susa
  • 600
  • 3
  • 5
2

Tenia ese mismo problema lo solucione agregando un meta con el charser utf-8 pero en la DB me aparecia mal, asi que hice lo siguiente:

en mi base de datos

ALTER TABLE 'nombre_de_tabla' CHANGE 'nombre_de_columna' CHARACTER SET utf8 COLLATE utf8_spanish_ci;

asi mi base de datos tomo la ñ como dios manda, si cambias a "utf8_spanish2_ci" tomara la "ll" y "ch" como letras, no varia mucho pero recomiendo utf8_spanish_ci ya que a mi me ha funcionado a la perfeccion :)

Kevin Mora
  • 71
  • 6
0

hola chicos gracias por responder, tengo configurado todo para que tome utf8, la etiqueta en el head y en la base de datos tengo seleccionado el cotejamiento "utf8 general ci", logre "solucionarlo" de la siguiente manera, yo tenia esto que agregaba un prod. a la base de datos:

if (isset($_POST['nombreProd']) && isset($_POST['stockProd'])) {

            $nombreProd= strtolower($_POST['nombreProd']);

            $stockProd=$_POST['stockProd'];

            $_SESSION['msg']="Se agrego el producto correctamente";

        }


        $db=mysqli_select_db($conexion,$basededatos);
        $db = mysqli_select_db( $conexion, $basededatos ) or die ( "Upps! no se ha podido conectar a la base de datos");

            $query="INSERT INTO productos (`nombreProd`,`stockProd`) VALUES ('$nombreProd','$stockProd');";
            $resultado = mysqli_query( $conexion, $query ) or die ( "Algo ha ido mal en la consulta a la base de datos");

            header("location: ./adminStock.php");

    break;

escrito el codigo asi, lo que pasa es que me muestra el signo "?" en las "ñ", tanto en el navegador como en la base de datos, lo raro es que lo que hice fue simplemente sacarle el "strtolower", por lo que quedo:

  if (isset($_POST['nombreProd']) && isset($_POST['stockProd'])) {

            $nombreProd= $_POST['nombreProd'];

y ahora me lo muestra bien en el navegador (aunque en la base de datos siguen saliendo letras raras). que puede ser?, necesito que este todo en minusculas puesto que los nombres de los productos no se pueden repetir y puede haber un nombre con mayus y otro sin y la base de datos los toma distintos, me explico? espero me puedan ayudar gracias

mariano1424
  • 113
  • 1
  • 10
  • 1
    puedes usar `mb_strtolower` en el php ó `select lower(valor)` ,`insert lower(valor)`.. etc en el SQL. mb_strolower es la versión unicode de strtolower y si el php no está configurado para usar utf-8 internamente aparecen esas cosas. – alo Malbarez Apr 04 '18 at 18:29
  • gracias! me funciono!, ahora pude hacer que se guarden en minusculas, pero en la base de datos sigue mostrandome caracteres raros... he configurado todo en utf 8 y ya no se que puede ser... en el navegador se ve bien asi que ya estoy tranquilo pero me gustaria saber porque no se guarda correctamente en la base de datos – mariano1424 Apr 04 '18 at 20:51
0

Bajo mi punto de vista antes de realizar un insert deberias tener un metodo que consulte (select) en la db si existe dicho registro que se va insertar en este caso un producto en caso de no existir dicho producto insertarlo.

  • adicional a ello en el post cuando recibes el nombre del producto deberias convertirlo a minusculas antes de hacer el insert

ejemplo:

$str = "Mary Had A Little Lamb and She LOVED It So";
$str = strtolower($str);
echo $str; //  mary had a little lamb and she loved it so

suerte espero te sirva !!

Diego Avila
  • 5,306
  • 2
  • 16
  • 40