0

Estoy tratando de insertar en una tabla MySQL y estoy utilizando una condición, el código es el siguiente:

    function updateBadgesChamilo($DB, $DB2, $id){
    $sql = "SELECT b.name as competencia FROM skill s 
            INNER JOIN skill_rel_user sru ON s.id=sru.skill_id
            INNER JOIN user u ON u.id=sru.user_id
            INNER JOIN sm4rtuniversity.members m ON m.email=u.email
            INNER JOIN sm4rtuniversity.badges b ON b.name=s.name
            WHERE m.id = :id";

    $comunicacion;

    try{
        $statement = $DB2->prepare($sql);
        $statement->bindParam(":id", $id);
        $statement->execute();
        $resultado = $statement->fetchAll();

        if($resultado['competencia']=='Comunicacion Asertiva'){
            $comunicacion = 'si';
        }else{
            $comunicacion = 'no';
        }

        //Comunicación asertiva
        $comunicacionID = '23' ;

        $sqlComunicacion = "INSERT INTO badges_members (user_id, badge_id, active)
                            VALUES (':id',':comunicacionID',':comunicacion')
                            ON DUPLICATE KEY UPDATE active=':comunicacion'";

        $stmtcomunicacion = $DB->prepare($sqlComunicacion);
        $stmtcomunicacion->bindParam(":id", $id);
        $stmtcomunicacion->bindParam(":comunicacionID", $comunicacionID);
        $stmtcomunicacion->bindParam(":comunicacion", $comunicacion);
        $stmtcomunicacion->execute();


    }catch (Exception $ex) {
        $ex->getMessage();
    }

}

Mando llamar a esa función de la siguiente manera:

    updateBadgesChamilo($DB, $DB2, $user['id']);

En la columna active de la tabla badges_members tendría que insertarse un sí, ya que el resultado de la consulta es "Comunicacion Asertiva".

Comunicacion Asertiva

Pero se inserta como un no.

if

Al parecer creo que la condición esta bien.

Pero no se que otra parte del código este funcionando de mala manera.

1 Answers1

1

Guillermo, prueba esta solución en la cual he optimizado tu código, dándole además seguridad contra ataques de inyección SQL.

Este es un ejemplo de código controlado en todo momento. Verás que el código usa una variable $msgInfo que va recogiendo todo lo que ocurre durante el recorrido. Esa variable se imprimirá al final y te dirá siempre el resultado final de tu ejecución.

Aparte de lo ya dicho, he aplicado otras mejoras como:

  • uso de estilo orientado a objetos en todo el código, puesto que tenías una mezcla de este estilo y el estilo procedural, lo cual no es recomendable
  • cierre de recursos cuando estos no se necesiten
  • uso de operador ternario para guardar valores, evitando así bloques if ... else...

Espero te sea de utilidad. Si no entiendes algo del código no dudes en preguntar.

$msgInfo="";
if ($mysqli){
    $sql = "SELECT b.name as competencia
            FROM skill s 
            INNER JOIN skill_rel_user sru ON s.id=sru.skill_id
            INNER JOIN user u ON u.id=sru.user_id
            INNER JOIN sm4rtuniversity.members m ON m.email=u.email
            INNER JOIN sm4rtuniversity.badges b ON b.name=s.name
            WHERE b.name = 'Comunicacion Asertiva'
            AND m.id = ? LIMIT 1";
    $stmt=$mysqli->prepare($sql);

    if ($stmt){ 
        $stmt->bind_param("i", $id);
        $stmt->execute();
        $stmt->bind_result($competencia);
        $stmt->fetch();
        $stmt->close();

        $comunicacionID = '23';
        $comunicacion=($competencia=='Comunicacion Asertiva') ? 'si' : 'no';
        $msgInfo.="SELECT exitoso. Comunicación tiene el valor: ".$comunicacion; 

        $sqlComunicacion = "INSERT INTO badges_members (user_id, badge_id, active)
                            VALUES (?,?,?)
                            ON DUPLICATE KEY UPDATE active=?";

        $stmtInsert=$mysqli->prepare($sqlComunicacion);

        if ($stmtInsert){ 
            $stmtInsert->bind_param("iiss", $id,$comunicacionID,$comunicacion,$comunicacion);
            $stmtInsert->execute();
            $stmtInsert->close();
            $msgInfo.="INSERT exitoso"; 

        }else{

            $msgInfo.="Error en el INSERT: ".$mysqli->error; 

        }

    }else{

        $msgInfo.="Error en el SELECT: ".$mysqli->error; 

    }

    $mysqli->close();

}else{

    $msgInfo.="Error en la conexión. Revise las credenciales para conectar a la base de datos"; 

}

echo $msgInfo;
A. Cedano
  • 86,578
  • 19
  • 122
  • 221
  • Gracias por el còdigo, ya lo cambie a PDO para que este sea un poco màs seguro pero sigue sin funcionar. Mi duda es que la siguiente: Como trabajo con dos bases de datos distintas tal vez PHP no este reconociendo esto o no se . – Guillermo Ricardo Spindola Bri Apr 26 '18 at 19:26
  • @GuillermoRicardoSpindolaBri Si lo cambiaste a PDO mucho mejor. En caso de necesitar trabajar con dos BD distintas tan sólo tendrías que crear dos objetos de conexión y usar el que necesites según la DB/Tabla que vayas a consultar. Por ejemplo: `$pdo1=new PDO (*credenciales BD 1*); $pdo2=new PDO (*credenciales BD 2*);` y luego usas `$pdo1` o `$pdo2` según el caso. – A. Cedano Apr 26 '18 at 21:13