ACTUALIZACIÓN
Cuando enviamos valores por PHP en una URL, el lenguaje usa por defecto el símbolo &
para separar los diferentes valores. Si te fijas en la barra de navegación verás:
... index.php?action=editar&id=&CC
Significa que todo lo que hay después del símbolo ?
son valores que se pasan al servidor y que luego se obtienen por _$POST
, por _$GET
, etc.
Supongamos algo como esto:
... index.php?action=editar&id=1&nombre=Juan&apellido=Mendez
entre cada &
habrá valores de forma asociativa:
id=1
nombre=Juan
apellido=Mendez
que luego se obtienen por
$_POST["id"]
, $_POST["nombre"]
, etc.
El problema es que en tu caso: action=editar&id=&CC
id
es igual a nulo o vacío, porque la &
que hay antes de CC
lo que hace es indicar a PHP que empieza otra variable llamada CC
.
Solución:
Usar en vez de ese valor, otro valor que identifique de manera única las filas de tu tabla, si es un valor numérico mejor, por ejemplo, la columna autoincremental de la tabla.
Si la tabla categoria
tuviese un campo numérico llamado por ejemplo id_categoria
que indentifique de forma unívoca cada fila de la tabla, es mejor pasar ese campo:
$alm->__SET('categoria', $r["id_categoria"]);
Entonces tu URL se presentaría por ejemplo así:
... index.php?action=editar&id=8945
luego obtienes id
con _$GET
o con $_POST
. Ejemplo:
$id=_$GET["id"];
y le pasas el valor de $id
en el WHERE id_categoria=?
.
En cuanto a la conexión PDO, tienes establecido dos veces el charset. Es decir, que esta línea sobra:
$this->pdo->exec("SET NAMES 'utf8';");
pues más arriba ya estableciste el charset haciendo:
$this->pdo->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
@deprecated
En realidad el problema de las ñ y las dos noticias (que no es lo mismo que error) que estás teniendo, son dos cosas distintas.
A. El problema de las ñ
Es un problema de codificación de caracteres. El cual puede encontrarse en varios niveles.
Ya has dicho que el HTML está bien:
<meta http-equiv="Content-Type" content="text/html"; charset=utf-8"/>
entonces es muy probable que el problema sea que, al hacer tu conexión PDO no le estés indicando que se conecte con el charset utf-8. Puedes consultar al respecto lo que dice el Manual de PHP. A veces, aunque el charset de la base de datos esté bien, no se presenta correctamente si no indicamos en la conexión que queremos usar el charset utf-8.
Ejemplos de conexión seteando el charset:
$pdo = new PDO("mysql:host=localhost;dbname=DB;charset=UTF8");
o bien:
<?php
$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'username';
$password = 'password';
$options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
);
$dbh = new PDO($dsn, $username, $password, $options);
?>
Si ya tienes bien seteado el charset en la BD y en la conexión y te sigue dando problema de las ñ, entonces habría que verificar que esa columna que te está arrojando valores con problemas tiene la buena codificación en la base de datos o bien en último término hay que pensar en establecer el charset en la configuración del servidor (PHP u otro) a utf-8.
Sobre los problemas de codificación puedes ver también la respuesta a esta pregunta: � Caracter inspector aparece en algunos datos obtenidos de la BBDD
B. Las dos noticias
Notice: Trying to get property of non-object in
C:\xampp\htdocs\ScriptBBDD\2\alumno.model.php on line 56
Notice: Trying to get property of non-object in
C:\xampp\htdocs\ScriptBBDD\2\alumno.model.php on line 57
indican que estás intentando de acceder a una propiedad de un objeto que no existe. O sea, es como si objeto no existiese y tu hicieras esto: objeto->dame_esta_propiedad();
. Entonces el código te dice: pero buenooo, objeto
no existe, esa propiedad no puedo dártela. Es una noticia, o sea, PHP te informa de que eso no está bien, pero te lo deja pasar y por eso el código funciona. Si fuese un error verías seguramente tu pantalla en blanco.
¿Dónde estás haciendo eso? En dos líneas de tu código, las líneas 56 y 57 de tu código.
¿Serán estas dos?:
$alm->__SET('acronimo', $r->acronimo);
$alm->__SET('categoria', $r->categoria);
Es muy probable. Si acronimo y categoria son dos columnas de tu base de datos y quieres setear esos valores a la variable $alm
no estás haciendo bien.
Puedes hacer esto:
$r = $stm->fetch(PDO::FETCH_ASSOC);
Y luego:
$alm->__SET('acronimo', $r["acronimo"]);
$alm->__SET('categoria', $r["categoria"]);
Notas:
- Entre los corchetes después de $r debe haber exactamente los nombres de columnas como están en la base de datos.
- Para comprobar que hay datos en
$r
puedes hacer un print_r($r)
en el cual verás un arreglo asociativo si tu consulta ha obtenido datos.
Nótese que PDO::FETCH_ASSOC es una de las formas que tiene PDO para obtener nuestros resultados. Lo que hace es crear un arreglo asociativo de nuestros resultados en los que la llave (key) es el nombre de cada columna del resultado y el valor es el contenido de dicha columna.