Quantcast
Channel: Grafikart | Derniers Sujets du forum
Viewing all 4861 articles
Browse latest View live

Pratique POO: Impossible d'administrer les articles et les catégories

$
0
0

Bonjour, je suis entrain de suivre le cours sur la mise en pratique de la POO avec PHP, au chapitre 30 (Rôle administrateur) ou à un moment donné où lorsque je voulais accéder à la page d'administration des articles et des catégories, je tombe sur une page vide. Par contre, la page principale (mondomaine.com/admin) marche correctement. La page vide apparait au moment où je veux gérer les articles et les catégories.

Ce que je fais

voici ici mon code dans les différentes pages:
BlogModule

class BlogModule extends Module
{
    const DEFINITIONS = __DIR__.'/config.php';
    const MIGRATIONS = __DIR__.'/db/migrations';
    const SEEDS = __DIR__.'/db/seeds';
    /**
     * On construit les routes possibles pour le Module Blog
     * BlogModule constructor.
     * @param ContainerInterface $container
     */
    public function __construct(ContainerInterface $container)
    {
        $router = $container->get(Router::class);
        $prefix = $container->get('blog.prefix');
        $router->get($prefix, PostIndexAction::class, 'blog.index');
        $router->get($prefix.'/{slug:[a-z\-0-9]+}-{id:[0-9]+}', PostShowAction::class, 'blog.show');
        $router->get($prefix.'/categories/{slug:[a-z\-0-9]+}', CategoryShowAction::class, 'blog.category');
        $container->get(RendererInterface::class)->addPath('blog', __DIR__.'/views');

        /**
         * On Cherche à savoir si la page d'administration (blog.prefix) a été charger dans le container
         */
        if ($container->has('admin.prefix')) {
            $prefixAdmin = $container->get('admin.prefix');
            //$prefixModule = $container->get('blog.prefix');
            $router->crud("$prefixAdmin"."/posts", PostCrudAction::class, 'blog.admin');
            $router->crud("$prefixAdmin"."/categories", CategoryCrudAction::class, 'blog.category.admin');
        }
    }
}

Méthode Crud de la classe Router.php

public function crud(string $prefixPath, $callable, string $prefixName)
    {
        $this->get("$prefixPath", new CallableMiddleware($callable), "$prefixName.index");
        $this->get("$prefixPath/create", new CallableMiddleware($callable), "$prefixName.create");
        $this->post("$prefixPath/create", new CallableMiddleware($callable));
        $this->get("$prefixPath/{id:[0-9]+}", new CallableMiddleware($callable), "$prefixName.edit");
        $this->post("$prefixPath/{id:[0-9]+}", new CallableMiddleware($callable));
        $this->delete("$prefixPath/{id:[0-9]+}", new CallableMiddleware($callable), "$prefixName.delete");
        //die(var_dump($callable));
    }

Ce que je veux

Pour permettre de me faire comprendre, la page d'administration des articles est appelée en excutant la méthode invoke de la classe PostCrudAction. Ce que je remarque alors c'est que cela ne se fait pas et par conséquent, il y a aucun retour devant mon navigateur.
Alors, je veux comprendre pourquoi il n'y a pas de retour.
Merci d'avance


j'ai une fatal error sur mon espace menbre

$
0
0

Bonjour à tous ,
j'ai un petit soucis suite au tuto " gestion d'un espace menbre ( refactoring)

je m'inscris : la base de donnée ce remplie , je reçois l'email et la validation est OK .
Mais si je veux modifier le mot de passe j'obtiens cette erreur :

Fatal error: Uncaught Error: Call to a member function prepare() on null in /homepages/34/d781897486/htdocs/account.php:12 Stack trace: #0 {main} thrown in /homepages/34/d781897486/htdocs/account.php on line 12

voici la ligne 12 de la page account.php :

$pdo->prepare('UPDATE users SET password = ? WHERE id = ?')->execute([$password, $user_id]);

Si je ne me trompe pas cette ligne correspond à la page database.php :

<?php
class Database{

    private $pdo;

    public function __construct($login, $password, $database_name, $host = 'db******.hosting-data.io'){
        $this->pdo = new PDO("mysql:dbname=$database_name;host=$host", $login, $password);
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
    }

    /**
     * @param $query
     * @param bool|array $params
     * @return PDOStatement
     */
    public function query($query, $params = false){
        if($params){
            $req = $this->pdo->prepare($query);
            $req->execute($params);
        }else{
            $req = $this->pdo->query($query);
        }
        return $req;
    }

    public function lastInsertId(){
        return $this->pdo->lastInsertId();
    }

}

j'ai modifié le fichier db.php pour inlure mes identifiants

je ne comprend pas pourquoi je peux inserer des données dans la bdd mais pas les modifiées , si vous avez une idée ??

je code aussi bien en php , qu'un parpaing qui nage dans une piscine ...

UN GRAND MERCI :)

Soumettre plusieurs input

$
0
0

Salut a tous,
Juste pour savoir si c'est possible de soumettre un formulaire avec un nombre de champ (input) non déterminer.
Bref un formulaire donc le nombre de champ dépend de l'utilisateur, il peut en avoir 1 où 15 par exemple.

Problème message flash

$
0
0

Bonjour,

Grâce au tutoriel de Grafikart, j'ai pu crée mon éspace connexion et inscription.
Le problème est par rapport aux messages flash, sans eux, l'utilisation devient moins compréhensible!
Je galère depuis environ 6heures à trouver un moyen de faire marcher un message flash, mais je ne sais pas comment faire.
J'ai rien trouvé d'interessant sur le sujet, à part avec bootstrap, mais le fichier css à télécharger me casse un peu mon codage.
J'aimerai faire un message Flash, avec ma div personnalisé:

.alert-sucess
{
border: 2px solid #0b2e13;
padding: 2px;
text-align:center;
width: 650px;
margin: 5px auto 5px auto;
background-color: #caffce;
color: #0b2e13;
}
.alert-danger
{
border: 2px solid #491217;
padding: 2px;
text-align:center;
width: 650px;
margin: 5px auto 5px auto;
background-color: #6A2B30;
color: #491217;
}
Quelqu'un pourrait m'aider ? merci énormement !

ImprImer des pages differentes

$
0
0

Bonjour,
j'ai une bd ou les client sont enregistrés et j'ai fais un fichier pdf pour recuperer et afficher leurs données heureusement tou marche
Mon souci est que je veux creer un bouton imprimer et lorsqu'on clique sur le bouton on va directement sur le pdf avec les info du client en question.
Aidez moi svp

Créer un profil pour page membres en php

$
0
0

Bonjour,

Voila je rencontre un petit problème avec mon code.
c'est simple, j'ai codé mon code pour que des informations tels que login, nom et prénom rentrent dans la base de donnée. je peux créer un utilisateur, mais lors de la redirection vers sa page de profil, impossible d'afficher les $_SESSION

ma page de profil:

<?php
session_start();
require_once('InfoTable.php');

$bdd = new PDO('mysql:host=localhost;dbname=base test', 'root', ''); 
try { 
$bdd = new PDO('mysql:host=localhost;dbname=base test', 'root', '');
 } 
catch (Exception $e) 
{        
die('Erreur : ' . $e->getMessage()); }


/* Variable existe, (et sup à 0 car pas variable à 0) si oui alors afficher tout sinon on affiche rien */
if(isset($_GET['id_user']) AND $_GET['id_user']>0)
{

/* $getid= convertir en nombre si utilisateur fait n'imp*/
    $getid = intval($_GET['id_user']);
/* requete péparer, sélectionner info de user*/
    $req = $bdd->prepare('SELECT * FROM membres WHERE id_user='.$_GET['id_user']);
/* requete, */
    $req->execute(array($getid));
    $utilisateur = $req->fetch();
?>

<html>
<head>
<title> Profil </title>
</head>
<body>
    <div align="center">
        <h1> Profil </h2>
        <br /> <br />
        <h2> Descripition: </h2>
        Nom d'utilisateur: <?php echo $utilisateur['login']; ?>
        <br />
        Email: <?php echo $utilisateur['mail']; ?>
        <br />
        Age:
        <br />
        Prenom: <?php echo $utilisateur['prenom']; ?>
        <br />
        Nom: <?php echo $utilisateur['nom']; ?>
        <br />
        <?php
        if(isset($_SESSION['id_user']) AND $utilisateur['id_user'] == $_SESSION['id_user'])
            { ?>
            <a href='personaliser_profil.php'> Personaliser mon profil </a>
            <a href='deconnexion.php'> Se déconnecter </a>
            <?php
            } ?>


    </div>
</body>
</html>


<?php
}
else
{header("Location:ConnexionDepart.php?erreur=intru"); // redirection en cas d'echec
exit;
} ?>

ma page de connexion:

<?php
require_once('InfoTable.php');


session_start(); // début de session

if (isset($_POST['login'])){ // execution apres envoi du formulaire
    $login = mysqli_real_escape_string($dbprotect, $_POST['login']); // mise en variable du nom d'utilisateur
    $pass = sha1($_POST['pass']); // mise en variable du mot de passe crypté

    // requete sur la table administrateurs (on récupère les infos de la personne)
    mysqli_select_db($dbprotect, $database_dbprotect);
    $verif_query = sprintf("SELECT * FROM $tablename_dbprotect WHERE login='$login' AND pass='$pass'"); // requête sur la base administrateurs
    $verif = mysqli_query($dbprotect, $verif_query) or die(mysqli_error($dbprotect));
    $row_verif = mysqli_fetch_assoc($verif);
    $utilisateur = mysqli_num_rows($verif);


    if ($utilisateur) {    // On test s'il y a un utilisateur correspondant
        $_SESSION['authentification'] = 1; // enregistrement de la session

        /* déclaration des variables de session */
        $_SESSION['id_user']= $row_verif['id_user'];
        $_SESSION['privilege'] = $row_verif['privilege']; 
        $_SESSION['nom'] = $row_verif['nom']; 
        $_SESSION['prenom'] = $row_verif['prenom']; 
        $_SESSION['login'] = $row_verif['login']; 
        $_SESSION['pass'] = $row_verif['pass']; 
        /* Redirection vers son profil personel!*/
        header("Location: profil.php?id_user=" .$_SESSION['id_user']);
        exit;
}
    else {
        header("Location: ConnexionDepart.php?erreur=login"); // redirection si utilisateur non reconnu
        exit;
    }
}


// GESTION DE LA Déconnexion
if (isset($_GET['erreur']) && $_GET['erreur'] == 'logout'){ // Test sur les paramètres d'URL qui permettront d'identifier un "contexte" de déconnexion
header("Location: ConnexionDepart.php?erreur=delog");
exit;
}
?>
<html>
<head>
<title>Connexion au compte </title>
<style type="text/css">
<!--
.Style2 {color: #0000FF}
.Style5 {color: #FF0000}
.Style6 {font-family: Verdana, Arial, Helvetica, sans-serif}
.Style7 {font-size: 12px}
.Style10 {
    font-size: 14px;
    font-weight: bold;
}
-->
</style>
</head>
<body>
<form action="" method="post" name="connect" class="Style6">
  <p align="center" class="Style7"><strong>      
      <?php if(isset($_GET['erreur']) && ($_GET['erreur'] == "login")) 
      {         if(isset($_GET['erreur']) && ($_GET['erreur'] == ""))

            // Affiche l'erreur
      echo '<span class="Style5"> Echec d\'authentification !!! login ou mot de passe incorrect </span>'; 
      }
      if(isset($_GET['erreur']) && ($_GET['erreur'] == "delog")) { // Affiche l'erreur
      echo '<span class="Style2">Déconnexion réussie... A bientôt '.$_SESSION['prenom'].' !</span>';
      session_unset();
      }
      if(isset($_GET['erreur']) && ($_GET['erreur'] == "intru")) { // Affiche l'erreur 
      echo '<span class="Style5">Echec d\'authentification !!! > Aucune session n\'est ouverte</span>
      <span class="Style5">ou vous n\'avez pas les droits pour afficher cette page.</span>';
      } ?>
  <p align="center" class="Style7"><em>Authentification sécurisée utilisant :<br>
  - BDD MySQL<br> 
  - Sessions PHP<br>
  - Cryptage en SHA1</em></p>
  <p align="center" class="Style7"><em><a href="lisez_moi.htm">lire les instructions >></a></em></p>
  <div align="center" class="Style7">  
    <table width="300" border="1" cellpadding="0" cellspacing="0" bordercolor="#CCCCCC">
      <tr>
        <td>
        <table width="400"  border="0" cellpadding="10" cellspacing="0" bgcolor="#eeeeee">
          <tr>
            <td width="50%"><span class="Style7">LOGIN</span></td>
            <td width="50%"><input name="login" type="text" id="login"></td>
          </tr>
          <tr>
            <td width="50%"><span class="Style7">MOT DE PASSE </span></td>
            <td width="50%"><input name="pass" type="password" id="pass"></td>
          </tr>
          <tr>
            <td height="34" colspan="2"> 
                <div align="center">
                <input type="submit" name="Submit" value="Se connecter">
                </div>
            </td>
          </tr>
          <tr>
            <td>
                <p align="center" class="Style7"> <a href="AjoutUtilisateur.php">Me créer un compte</a></p>
            </td>
          </tr>
        </table>
        </td>
      </tr>
    </table>  
 </div>


</form>
</body>
</html>

ma page "InfoTable":

<?php
// paramètres de connexion
$hostname_dbprotect = "localhost";  // nom de votre serveur
$username_dbprotect = "root";       // nom d'utilisateur (root par défaut) !!! ATTENTION, en utilisant root, vos visiteurs ont tous les droits sur la base
$password_dbprotect = "";           // mot de passe (aucun par défaut mais il est conseillé d'en mettre un)
$database_dbprotect = "dbprotect";  // nom de votre base de données   
$tablename_dbprotect= "membres";    // nom de la table utilisée
$dbprotect = mysqli_connect($hostname_dbprotect, $username_dbprotect, $password_dbprotect) or trigger_error(mysqli_err($dbprotect),E_USER_ERROR); 
?>

Ce que je veux

obtenir les infos de l'utilisateur sur le profil

Ce que j'obtiens

Profil

Descripition:
Nom d'utilisateur:
Email:
Age:
Prenom:
Nom:

sans info, ou message d'erreur

Altorouter

$
0
0

Bonjour,
j'ai suivi le tutoriel sur altorouter et lors que je demare le seveur interne de php tous fonction mais sa chamboule avec Xampp meme sur un serveur mutialisé voici l erreur :

Wa****mairning: require(../template/.php): failed to open stream: No such file or directory in C:\xampp\htdocs\ALYIA\public\index.php on line 23

Fatal error: require(): Failed opening required '../template/.php' (include_path='C:\xampp\php\PEAR') in C:\xampp\htdocs\ALYIA\public\index.php on line 23

Router\Route::getParams() must be of the type array

$
0
0

Bonjour,

Je rencontre un petit problème avec mon code, je suis actuellement en train de suivre le tutoriel "Le router", je rencontre une petite erreur que je n'arrive pas a résoudre

Ce que je fais

Fichier Route.php

<?php

namespace App;

class Route {

    /**
     * @var string
     * @var callable
     * @var array
     */
    private $name;
    private $callback;
    private $parameters;

    public function __construct(string $name, callable $callback, array $parameters) {

    }

    /**
     * @return string
     */
    public function getName(): string {
        return $this->name;
    }

    /**
     * @return callable
     */
    public function getCallback(): callable {
        return $this->callback;
    }

    /**
     * Retrieve the URL Parameters
     * @return string[]
     */
    public function getParams(): array {
        return $this->parameters;
    }
}

Fichier RouterTest.php

<?php

namespace Tests\App;

use App\Router;
use GuzzleHttp\Psr7\ServerRequest;
use PHPUnit\Framework\TestCase;

class RouterTest extends TestCase {

    /**
     * @var Router
     */
    private $router;

    public function setUp() {
        $this->router = new Router();
    }

    public function testGetMethod() {
        $request = new ServerRequest('GET', '/blog');
        $this->router->get('/blog', function () { return 'hello'; }, 'blog');
        $route = $this->router->match($request);
        $this->assertEquals('blog', $route->getName());
        $this->assertEquals('hello', call_user_func_array($route->getCallback(), [$request]));
    }

    public function testGetMethodIfURLDoesNotExists() {
        $request = new ServerRequest('GET', '/blog');
        $this->router->get('/blogaze', function () { return 'hello'; }, 'blog');
        $route = $this->router->match($request);
        $this->assertEquals(null, $route);
    }

    public function testGetMethodWithParameters() {
        $request = new ServerRequest('GET', '/blog/mon-slug-8');
        $this->router->get('/blog', function () { return 'azeaze'; }, 'posts');
        $this->router->get('/blog/{slug:[a-z0-9\-]+}-{id:\d+}', function () { return 'hello'; }, 'post.show');
        $route = $this->router->match($request);
        $this->assertEquals('post.show', $route->getName());
        $this->assertEquals('hello', call_user_func_array($route->getCallback(), [$request]));
        $this->assertEquals(['slug' => 'mon-slug', 'id' => '8'], $route->getParams());
    }
}

Ce que je veux

Je voudrais que le teste passe au vert

Ce que j'obtiens

Le teste avec PHPUnit me dit les erreurs suivantes :
TypeError : Return value of App\Router\Route::getName() must be of the type string, null returned

La deuxième
TypeError : Return value of App\Router\Route::getCallback() must be callable, null returned

La troisième
TypeError : Return value of App\Router\Route::getParams() must be of the type array, null returned

Merci d'avance pour votre aide, de mon côté j'essaye de regler cette erreur

Si ça peut aider et que le problème vienne d'une version d'un library, voici les require de mon composer.json

"require": {
        "michelf/php-markdown": "1.8.0",
        "guzzlehttp/psr7": "^1.5",
        "http-interop/response-sender": "^1.0",
        "zendframework/zend-expressive-fastroute": "1.2.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^6.2",
        "squizlabs/php_codesniffer": "^3.4"
    },
    ```

Boite modal

$
0
0

Bonsoir,

Je rencontre un petit souci avec une boite modal et j'avoue que je pensais pas avoir un souci avec un truc pourtant simple en soit.

Pour poser les bases, je suis entrain de développer une petit ludothèque avec un modéle MVC.

Là, je suis sur la partie admin.

J'ai fait un affichage sous forme de tableau de tout les jeux que je possède. Jusqu'à tout va bien. J'ai ensuite créer le bouton supprimer avec ce qui va derrière la aussi pas de blem. J'ai ensuite continuer sur un bouton modifier qui afficherait une boite modal avec les des champs préremplis qu'on pourrait modifier avec un bouton valider et tout.

Le hic c'est que je bloque à la création de la boite modal. Quand je clique sur le bouton modifier, je vois la boite le temps du chargement et hop disparu. Je vois pas trop d'ou cela peut venir. Après je m'y prend peut etre mal c'est une posibilité.

Là on a le code de view.php

<div id="ModifierJeu">
      <?php
   ModifierJeuAdmin();
?>
</div>

là le bouton pour afficher la boite modal, qui se trouve dans une fonction de modelAdmin.php

echo "<td><button type='submit' name='modifier' value = '".htmlspecialchars($donnees['id'], ENT_QUOTES|ENT_HTML5)."' class='btn btn-info btn-lg' data-toggle='modal' data-target='#myModal'>Open Modal</button></td>";

le controler action_admin.php

if(!empty($_POST['modifier'])) {
  ModifierJeuAdmin($_POST['modifier']);

}

la fonction dans modelAdmin.php

function ModifierJeuAdmin() {

    echo'<div id="myModal" class="modal fade" role="dialog">';
      echo'<div class="modal-dialog">';
        echo'<div class="modal-content">';
          echo'<div class="modal-header">';
           echo' <button type="button" class="close" data-dismiss="modal">&times;</button>';
           echo' <h4 class="modal-title">Modal Header</h4>';
          echo'</div>';
          echo'<div class="modal-body">';
            echo'<p>Some text in the modal.</p>';
          echo'</div>';
          echo'<div class="modal-footer">';
            echo'<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>';
         echo'</div>';
        echo'</div>';

      echo'</div>';
    echo'</div>';


}

Quelqu'un pourrait m'éclaire sur la question ou meme me dire que je me plante complétement et que mon code est à mettre à la corbeille ce qui est tout à fait possible. Mais dans ce cas, je veux bien savoir comment intégrer une boite modal dans mon MVC..

Merci à vous

Utiliser une classe A dans une classe B

$
0
0

Bonjour,

Voila je rencontre un petit problème avec mon code. Je débute en POO mais j'ai des connaissances en PHP, qui je pense me permettent de suivre les cours de POO. Il faut se lancer !

Ce que je fais

Je souhaite utiliser ma classe A (connexion, requêtes base de données) dans ma classe B, C, D...

Ma classe A ressemble à ça :

<?php

class Database{

    private $db_name = '$';
    private $db_user = '$';
    private $db_host = '$$$';
    private $db_pass = '$';
    protected $pdo;


    private function getPDO(){
        if($this->pdo === null){
            $pdo = new PDO('mysql:host='.$this->db_host.';dbname='.$this->db_name.';charset=utf8', $this->db_user, $this->db_pass);
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->pdo = $pdo;
        }
        return $this->pdo;
    }

    public function query($statement, $params = null){
        $req = $this->prepare($statement);
        $req->execute($params);
        $datas = $req->fetchAll(PDO::FETCH_OBJ);
       return $datas;
    }
    ?>

Ce que je veux

Je ne sais pas comment trop m'y prendre pour l'utiliser "proprement" dans mes autres classes. En fait, ce qui me rebute, c'est la connexion. Dans une page PHP, je peux très bien utiliser plusieurs autres classes (membres, appareils...). Qui elles-même feront appel à la classe A.
Je pensais la solution de l'extension (via extends) mais cette architecture n'est-elle pas "réservée" à la modification de la classe parente ?
Je pensais également à instancier la classe A dans une fonction de mes autres classes. Mais, au vu du fonctionnement de la POO, chaque objet est "indépendant". Donc, instancier une connexion sur la classe B, C, D... n'est pas très propre à mon sens. Voyez-vous ce que je veux dire ?
Quelles solutions me conseilleriez-vous ?

PS : Je cherche pas forcément qu'on me ponde un code tout fait... Je suis plutôt à la recherche de conseils... Merci d'avance, et je vous remercie de votre aide ainsi que de vos conseils bienveillants :)

Problème de require avec le Renderer

$
0
0

Bonjour,

Voila je rencontre un petit problème avec mon code, je suis en train de suivre de tutoriel sur le renderer et lorsque j'actualise mon site, celui ci me retourne une erreur avec un problème de require

Ce que je fais

Je voudrais que le require soit dans le bon répertoire sachant que actuellement il pointe vers app/Modules/views/index.php alors qu'il devrait être à la racine du projet puis dans public/themes/default/blog/views/index.php

Voici le fichier Renderer.php qui se situe dans le répertoire app\Renderer.php

<?php


namespace App;

class Renderer {

    const DEFAULT_NAMESPACE = '__MAIN';

    private $paths = [];

    public function addPath(string $namespace, ?string $path = null): void {
        if (is_null($path)) {
            $this->paths[self::DEFAULT_NAMESPACE] = $namespace;
        } else {
            $this->paths[$namespace] = $path;
        }
    }

    public function render(string $view): string {
        if ($this->hasNamespace($view)) {
            $path = $this->replaceNamespace($view) . '.php';
        } else {
            $path = $this->paths[self::DEFAULT_NAMESPACE] . DIRECTORY_SEPARATOR . $view . '.php';
        }
        ob_start();
        require($path);
        return ob_get_clean();
    }

    private function hasNamespace(string $view): bool {
        return $view[0] === '@';
    }

    private function getNamespace(string $view): string {
        return substr($view, 1, strpos($view, '/') - 1);
    }

    private function replaceNamespace(string $view): string {
        $namespace = $this->getNamespace($view);
        return str_replace('@' . $namespace, $this->paths[$namespace], $view);
    }
}

Le fichier RendererTest.php qui se situe dans tests/App/RendererTest.php

<?php


namespace Tests\App;

use App\Renderer;
use PHPUnit\Framework\TestCase;

class RendererTest extends TestCase {

    private $renderer;

    public function setUp() {
        $this->renderer = new Renderer();
    }

    public function testRenderTheRightPath() {
        $this->renderer->addPath('blog', __DIR__ . '/../public/themes/default/Blog');
        $content = $this->renderer->render('@blog/demo');
        $this->assertEquals('Salut les gens', $content);
    }

    public function testRenderTheDefaultPath() {
        $this->renderer->addPath(__DIR__ . '/../public/themes/default/Blog');
        $content = $this->renderer->render('demo');
        $this->assertEquals('Salut les gens', $content);
    }
}

Comme vous pouvez le voir, lorsque je fait le test avec PHPUnit tout ce passe bien, il trouve bien de dossier public (qui est dans n'est pas a la racine mais dans le fichier tests/public), mais sur le serveur web cela ne fonctionne pas si je veux remonter le répertoire via /../

Ainsi que le fichier BlogModule.php qui se situe

<?php

namespace App\Modules;

use App\Router;
use App\Renderer;
use Psr\Http\Message\ServerRequestInterface;

class BlogModule {

    private $renderer;

    public function __construct(Router $router) {
        $this->renderer = new Renderer();
        $this->renderer->addPath('blog', __DIR__ . '/public/themes/default/Blog/views');
        $router->get('/blog', [$this, 'index'], 'blog.index');
        $router->get('/blog/{slug:[a-z\-]+}', [$this, 'show'], 'blog.show');
    }

    public function index(ServerRequestInterface $request): string {
        return $this->renderer->render('@blog/index');
    }

    public function show(ServerRequestInterface $request): string {
        return $this->renderer->render('@blog/show');
    }
}

Ce que je veux

Je voudrais avoir la bonne redirection sans le problème de require et ainsi afficher la page index.php qui se situe dans le dossier public/themes/default/Blog/views/index.php

Ce que j'obtiens

J'obtiens une erreur sur mon serveur web (via wamp) la voici :

Warning: require(C:\wamp64\www\app\Modules/views/index.php): failed to open stream: No such file or directory in C:\wamp64\www\app\Renderer.php on line 36

Fatal error: require(): Failed opening required 'C:\wamp64\www\app\Modules/views/index.php' (include_path='.;C:\php\pear') in C:\wamp64\www\app\Renderer.php on line 36

J'ai essayer diverse chose mais cela ne fonctionner pas.

Je vous remercie d'avance.

Bonne fin de journée !

Problème d'autowiring php-di 5.4

$
0
0

Bonjour,

Je suis la formation de grafikart mise en pratique POO arrivé à la première vidéo administration du blog j'ai un soucis avec mon ContainerInterface que php-di version 5.4.0 ne parviens pas à charger.

Ce que je fais

Function __construct de mon BlogModule

public function __construct(ContainerInterface $container)
    {
        $container->get(RendererInterface::class)->addPath('blog', __DIR__ . '\views');
        $router = $container->get(Router::class);
        $router->get($container->get('blog.prefix'), BlogAction::class, 'blog.index');
        $router->get($container->get('blog.prefix').'/{slug:[a-z\-0-9]+}-{id:[0-9]+}', BlogAction::class, 'blog.show');

        if ($container->has('admin.prefix')) {
            $prefix = $container->get('admin.prefix');
            $router->get("$prefix\posts", AdminBlogAction::class, 'admin.blog.index');
        }
    }

Fichier config au niveau du Blog

use App\Blog\BlogModule;
use function DI\object;
use function DI\get;

return [
    'blog.prefix' => '/blog'
    ];

Fichier config au niveau de l'Admin

<?php

return [
    'admin.prefix' => '/admin'
];

Ce que je veux

Je cherche donc à afficher ma page d'administration

Ce que j'obtiens

Fatal error: Uncaught DI\Definition\Exception\DefinitionException: Entry "App\Blog\BlogModule" cannot be resolved: Entry "Psr\Container\ContainerInterface" cannot be resolved: the class is not instantiable Full definition: Object ( class = #NOT INSTANTIABLE# Psr\Container\ContainerInterface scope = singleton lazy = false ) Full definition: Object ( class = App\Blog\BlogModule scope = singleton lazy = false __construct( $container = get(Psr\Container\ContainerInterface) ) ) in C:\wamp64\www\sdlv\vendor\php-di\php-di\src\DI\Definition\Exception\DefinitionException.php:16 Stack trace: #0 C:\wamp64\www\sdlv\vendor\php-di\php-di\src\DI\Definition\Resolver\ObjectCreator.php(154): DI\Definition\Exception\DefinitionException::create(Object(DI\Definition\ObjectDefinition), 'Entry "App\Blog...') #1 C:\wamp64\www\sdlv\vendor\php-di\php-di\src\DI\Definition\Resolver\ObjectCreator.php(70): DI\Definition\Resolver\ObjectCreator->createInstance(Object(DI\Definition\ObjectDefinition) in C:\wamp64\www\sdlv\vendor\php-di\php-di\src\DI\Definition\Exception\DefinitionException.php on line 16

Je me suis pourtant rensiegner et est essayé d'activer manuellement l'autowiring mais rien n'y fait toujours la même erreur. Je me suis pourtant documenté pour essayer de trouver un autre moyen d'implémenter le ContainerInterface mais rien de concluant.
Après plusieurs jours de recherches je sèche.

Conteneur de dépendance doit être un tableau (__construct)

$
0
0

Bonjour,

Je suis en train de suivre le tutoriel sur le conteneur de dépendance, mais je sèche sur un problème, mon index.php me renvoie une erreur me disant qu'il attend un tableau mais c'est un objet qui lui ai envoyé.

J'ai suivie à la lettre le tutoriel de Grafikart, je l'ai adapté pour la version 6.0 de PHP-DI en remplacent les object par create car la function object est déprécié depuis PHP-DI 6.0

Ce que je fais

Décrivez ici votre code ou ce que vous cherchez à faire
Mon index .php

<?php

require '../vendor/autoload.php';
require '../define.php';

use App\App;
use App\Modules\BlogModule;
use DI\ContainerBuilder;
use GuzzleHttp\Psr7\ServerRequest;

$modules = [
    BlogModule::class
];

$builder = new ContainerBuilder();
$builder->addDefinitions(dirname(__DIR__, 1) . DS . 'app' . DS . 'Config' . DS . 'config.php');
foreach ($modules as $module) {
    if ($module::DEFINITIONS) {
        $builder->addDefinitions($module::DEFINITIONS);
    }
}
$builder->addDefinitions(__DIR__ . DS . 'config.php');
$container = $builder->build();

$app = new App($container, $modules);
$response = $app->run(ServerRequest::fromGlobals());
\Http\Response\send($response);

Mon blogModule

<?php

namespace App\Modules;

use App\Module;
use App\Router;
use App\Renderer\RendererInterface;
use Psr\Http\Message\ServerRequestInterface;

class BlogModule extends Module {

    const DEFINITIONS = __DIR__ . '/config.php';

    /**
     * @param Router $router
     * @param RendererInterface $renderer
     */
    public function __construct(string $prefix, Router $router, RendererInterface $renderer) {
        $this->renderer = $renderer;
        $this->renderer->addPath('blog', dirname(__DIR__, 2) . DS . 'public' . DS . 'themes' . DS . 'default' . DS . 'Blog' . DS . 'views');
        $router->get($prefix, [$this, 'index'], 'blog.index');
        $router->get($prefix . '/{slug:[a-z\-0-9]+}', [$this, 'show'], 'blog.show');
    }

    /**
     * @param ServerRequestInterface $request
     * @return string
     */
    public function index(ServerRequestInterface $request): string {
        return $this->renderer->render('@blog/index');
    }

    /**
     * @param ServerRequestInterface $request
     * @return string
     */
    public function show(ServerRequestInterface $request): string {
        return $this->renderer->render('@blog/show', ['slug' => $request->getAttribute('slug')]);
    }
}

le fichier Module.php

<?php

namespace App;


class Module {

    const DEFINITIONS = null;
}

et mon fichier App.php

<?php

namespace App;

use GuzzleHttp\Psr7\Response;
//use \Exception;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

class App {

    /**
     * @var array
     * @var Router
     */
    private $modules = [];
    private $container;

    public function __construct(array $modules = []) {
        $this->container = $container;
        foreach ($modules as $module) {
            $this->modules[] = $container->get($module);
        }
    }

    public function run(ServerRequestInterface $request): ResponseInterface {
        $uri = $request->getUri()->getPath();
        if (!empty($uri) && $uri[-1] == "/") {
            return (new Response())
                ->withStatus(301)
                ->withHeader('Location', substr($uri, 0, -1));
        }
        $router = $this->container->get(Router::class);
        $route = $router->match($request);
        if (is_null($route)) {
            return new Response(404, [], '<h1>Erreur 404</h1>');
        }
        $params = $route->getParams();
        $request = array_reduce(array_keys($params), function ($request, $key) use ($params) {
            return $request->withAttribute($key, $params[$key]);
        }, $request);
        $response = call_user_func_array($route->getCallback(), [$request]);
        if (is_string($response)) {
            return new Response(200, [], $response);
        } elseif ($response instanceof ResponseInterface) {
            return $response;
        } else {
            throw new \Exception('The response is not a string or an instance of ResponseInterface');
        }
    }
}

Ce que je veux

Je voudrais que m'erreur ci dessous disparaisse

Ce que j'obtiens

Voici l'erreur que j'obtiens

Fatal error: Uncaught TypeError: Argument 1 passed to App\App::__construct() must be of the type array, object given, called in C:\wamp64\www\public\index.php on line 40 and defined in C:\wamp64\www\app\App.php:34 Stack trace: #0 C:\wamp64\www\public\index.php(40): App\App->__construct(Object(DI\Container), Array) #1 {main} thrown in C:\wamp64\www\app\App.php on line 34

Je vous remercie d'avance pour l'aide que vous m'apporterai !

Bonne après midi !

Problème avec mes identifiant pour avoir accès à google API (YouTube)

$
0
0

Bonjour,

J'aimerais mettre en place une fonctionalité comme sur le site de Grafikart avec ma chaine YouTube. J'aimerais géré ma chaine YouTube depuis mon site web. Si je fait un nouveaux projet où une nouvelle tune par exemple. Je l'envois sur mon site web et mon serveur envois le vidéo à l'api YouTube après. Je sais qu'il y a déjà un tutorial sur le site web.

J'ai faisait des test pour implémenter cette fonctionalité. Je me suis créer des identifiant (Projet) via la console de Google pour comuniquer avec l'api de YouTube. Après 90 jours, j'ai un message avec le compte Google où je gère ma chaine YouTube:

Le projet 1234 n'a pas eu d'activé depuis 90 jours. Selon les politique de confidancialité de YouTube. Le système à bloquer l'accès à l'API YouTube pour ce projet.

J'ai trouver l'article qui parle des projets orphelin :

https://cloud.google.com/resource-manager/docs/project-suspension-guidelines?hl=fr

Parce-que mon projet était orphelin qui n'était pas le propriétaire d'une organisation. Je suis un dév indépendant. Je ne fait pas parti d'une entreprise web ou tout autre style de compagnie.

Comment je peut éviter que mon compte sois déclarer « Projet Orphelin » par Google et qu'il ne révoque pas mes identifiant pour contacter l'API de YouTube après 90 jours sans activité?

Merci de m'aide en avance.

BOT d'exploration internet

$
0
0

Bonjour,

Je voudrais créer un bot d'exploration internet qui fonctionnerait sur un serveur pour être H24 opérationnel. Il faudrait qu'il soit liable à une db.
Ce bot devra servir à effectuer seul des achats par exemple.

Cependant j'y connais rien dans le domaine des bots, donc je sais pas du tout quel langage choisir et s'il y a des formations pour ça.

Merci
cordialement,
Mattéo Goudin


Probléme PHP pour un nivôse

$
0
0

Bonjour,
Je suis novice en la matière,
Ci-joint le PHP de mon capteur de température qui fonctionne très bien avec le réseau Lorawan, je précise qu’il s’agit routage.
J’ai un capteur ultrason LoraWan qui 'doit mesurer" la hauteur d’eau se situant à une hauteur de 2m et je désire que ce même script relève la hauteur d’eau et ça ne fonctionne pas.
Dans l’attente,
Merci
Serge

<?php
/* *** receive data from telemesure.net service
*/

define("MODE", "POST"); //use GET, POST or EXTENDED
define("FILENAME", "log/clientrawobjenious.txt"); //name of the file

if(MODE === "GET")
{
$id = $_GET["id"]; // transmitter ID
$data = $_GET["data"]; // payload
file_put_contents(FILENAME, "$id,$data\n", FILE_APPEND | LOCK_EX);

} else if ( MODE === "POST"){
$id = $_POST["id"]; // transmitter ID
$data = $_POST["data"]; // payload
$data = hexdec(mb_strimwidth($data, 2, 4, ""))/10;
$id = date("Y-m-d H:i:s");
if($data > 6000){$data = $data-6553.6;$data = round($data, 1);}
file_put_contents(FILENAME, "$id, $data\n", FILE_APPEND | LOCK_EX);

} else if ( MODE === "EXTENDED") {
$id = $_POST["id"]; // transmitter ID
$data = $_POST["data"]; // payload
$node_ref = $_POST["node_ref"]; // id of the receiver
$link_quality= $_POST["link_quality"]; // level of the link quality
$rssi= $_POST["rssi"]; // intensity of signal
$lat= $_POST["lat"]; // geo latitude
$lng= $_POST["lng"]; // geo longitude
file_put_contents(FILENAME, "$id,$data\n", FILE_APPEND | LOCK_EX);
file_put_contents(FILENAME, ">>FROM:$node_ref LinkQuality:$link_quality Rssi:$rssi lat=$lat lng=$lng\n", FILE_APPEND | LOCK_EX);
}

?>

Débutant a besoin d'aide espace admin

$
0
0

Bonjour,

Voila je rencontre un petit problème avec mon code.

Étant débutant, je suis actuellement en train de réaliser un espace admin, mais toutes les aides que je cherche ailleurs ne répondent qu'en partie à ma question.

<?php include 'header.php' ?>

<?php
$db_host = "localhost";
$db_user = "root";
$db_pass = "";
$db_name = "spidermansite";
$conn = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
if (mysqli_connect_error()) {
    echo mysqli_connect_error();
    exit;
}
?>
<?php

var_dump($_POST);
$pass_hache = password_hash($_POST['pass'], PASSWORD_DEFAULT);
if (isset($_POST['pseudo'])&& ($_POST['pass_hache']) && ($_POST['email']) && ($_POST['pass']) )

$sql ="INSERT INTO membres(pseudo, pass, email, date_inscription);
VALUES('" . $_POST['pseudo'] . "','"
        . $_POST['pass_hache'] . "','"
        . $_POST['pass'] . "','"
        . $_POST['email'] . "')";

?>

    <div id="getoutfooter">
        <form>
            <input type="text" id="pseudo" name="pseudo" placeholder="Pseudonyme">
            <input type="password" id="pass" name="pass" placeholder="Entrer le mot de passe">
            <input type="password" id="pass" name="pass" placeholder="Confirmez le mot de passe">
            <input type="email" id="email" name="email" placeholder="entrez votre email">
            <input type="submit">
        </form>
    </div>
<?php include 'footer.php' ?>

J'obtiens l'erreur suivante:

Notice: Undefined index: pass in C:\wamp64\wamp64\www\test\inscription.php on line 24
Call Stack

Time Memory Function Location

1 0.0001 405528 {main}( ) ...\inscription.php:0

Mais je ne comprends pas car j'ai bien fais l'isset pour les autres (pseudo email, etc...) mais cela ne fonctionne pas.
J'ai réussis à faire tout mon site sans demander d'aide sur les forums mais la je bloque vraiment et je ne comprends pas ce que je fais de mal.

(même si j'essaye de remplir le form les données que j'entre ne s'actualisent pas dans ma bdd, je ne comprends pas non plus).

Si vous pouviez m'aider a régler mon problème :/
Merci!

Adapter le format d'une date

$
0
0

Bonjour,

j'essaye de retourner la date de yyyy-mm-dd à dd-mm-yyyy
Je suis allée voir les questions des autres mais impossimble de voir où est mon erreur!

function retourner_date($date_donnee)
{
    if ($date_donnee != NULL)
    {
        $date=$date_donnee;
        $dt= DateTime:: createFromFormat('d-m-Y', $date);
        echo $dt->format('Y-m-d');
    }
    else
    {
    print"";
    }
}

j'obtiens:
Uncaught Error: Call to a member function format() on boolean

c'est pourtant pas bien méchant comme code du coup je suis super frustré!

Administration du blog : probleme container et 404 sur l'admin

$
0
0

Bonjour,

Je suis la formation de grafikart mise en pratique POO arrivé à la première vidéo administration du blog je pense avoir un soucis avec php-di qui ne parviens pas à me charger une instance de mon ContainerInterface. Je ne comprends pas bien ce que veut dire Grafikart quand il dit que "php-di aurait deja injecter par rapport à a clé ContainerInterface le container". Comment vérifier que c'est bien le cas ?

Ce que je fais

Function __construct de mon BlogModule

public function __construct(ContainerInterface $container)
    {
        $container->get(RendererInterface::class)->addPath('blog', __DIR__ . '\views');
        $router = $container->get(Router::class);
        $router->get($container->get('blog.prefix'), BlogAction::class, 'blog.index');
        $router->get($container->get('blog.prefix').'/{slug:[a-z\-0-9]+}-{id:[0-9]+}', BlogAction::class, 'blog.show');

        if ($container->has('admin.prefix')) {
            $prefix = $container->get('admin.prefix');
            $router->get("$prefix\posts", AdminBlogAction::class, 'admin.blog.index');
        }
    }

Fichier config au niveau du Blog

use App\Blog\BlogModule;
use function DI\object;
use function DI\get;

return [
    'blog.prefix' => '/blog'
    ];

Fichier config au niveau de l'Admin

<?php

return [
    'admin.prefix' => '/admin'
];

Ce que je veux

Je cherche donc à afficher ma page d'administration et comprendre comment je peux vérifier que php-di à bien injecter le container par rapport à la clé ContainerInterface

Ce que j'obtiens

Fatal error: Uncaught DI\Definition\Exception\DefinitionException: Entry "App\Blog\BlogModule" cannot be resolved: Entry "Psr\Container\ContainerInterface" cannot be resolved: the class is not instantiable Full definition: Object ( class = #NOT INSTANTIABLE# Psr\Container\ContainerInterface scope = singleton lazy = false ) Full definition: Object ( class = App\Blog\BlogModule scope = singleton lazy = false __construct( $container = get(Psr\Container\ContainerInterface) ) ) in C:\wamp64\www\sdlv\vendor\php-di\php-di\src\DI\Definition\Exception\DefinitionException.php:16 Stack trace: #0 C:\wamp64\www\sdlv\vendor\php-di\php-di\src\DI\Definition\Resolver\ObjectCreator.php(154): DI\Definition\Exception\DefinitionException::create(Object(DI\Definition\ObjectDefinition), 'Entry "App\Blog...') #1 C:\wamp64\www\sdlv\vendor\php-di\php-di\src\DI\Definition\Resolver\ObjectCreator.php(70): DI\Definition\Resolver\ObjectCreator->createInstance(Object(DI\Definition\ObjectDefinition) in C:\wamp64\www\sdlv\vendor\php-di\php-di\src\DI\Definition\Exception\DefinitionException.php on line 16

Je me suis pourtant rensiegner et est essayé d'activer manuellement l'autowiring mais rien n'y fait toujours la même erreur. Je me suis pourtant documenté pour essayer de trouver un autre moyen d'implémenter le ContainerInterface mais rien de concluant.
Après plusieurs jours de recherches je sèche.

Message erreur formulaire php

$
0
0

Bonsoir à tous,
A nouveau, je viens solliciter votre aide.
J'ai créé un formulaire en html et son traitement en php.
Jusque-là, tout va bien : le formulaire fonctionne, je reçois toutes les infos par mail.
Mon problème se situe au niveau de message d erreur si des champs ne sont pas remplis. Si c'est le cas, cela renvoie à ma page traitement php sur laquelle est noté le message d'erreur et le script s'arrête. Et pour mon cas, le design du site s arrête aussi : normal avec la fonction die attachée au message d erreur.
Je tourne le truc dans tous les sens mais je ne vois pas où plus... J'ai bien pensé à mettre du javascript pour qu'une fenêtre s'ouvre si des champs ne sont pas remplis mais je ne vois pas où le mettre dans le php. L idée serait une fenêtre d erreur en restant sur la page du formulaire mal rempli et si le formulaire est bien rempli on bascule sur la page php indiquant que la demande à été envoyée.
Voilà pour l idée mais pour la mise en oeuvre je sèche.
C'est certainement quelque chose de très simple....
Merci d avance pour votre aide.

Viewing all 4861 articles
Browse latest View live