A random number (4) just appears in my php project - php

Im building a php project.
This is the structure
This is my init.php
<?php
use App\Core\Container;
require_once __DIR__."/../autoloader.php";
require_once __DIR__."/Core/Container.php";
$container = new Container();
which gets used within the index.php
<?php
require "./src/init.php";
$pathinfo = $_SERVER["PATH_INFO"];
$routes= [
"/team" => ['TeamController',
'showTeampage'],
];
if(isset($routes[$pathinfo])){
$controllername = $routes[$pathinfo][0];
$method = $routes[$pathinfo][1];
$controller = $container->make($controllername);
}
This is the container php where the problem occurs:
<?php
namespace App\Core;
use PDO;
use App\Team\TeamController;
use App\Team\TeamRepository;
class Container {
public $storage = [];
public $buildManuals = [];
public function __construct() {
$this->buildManuals = [
'pdo'=> function () {
$pdo = new PDO('mysql:host=localhost;dbname=vanillaPHP;charset=utf8', 'root', '');
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
return $pdo;
},
'TeamController'=> function() {
$controller = new TeamController();
},
'TeamRepository'=>function() {
return new TeamRepository($this->make("pdo"));
},
];
}
public function make(String $string) {
if(empty($this->storage[$string]) ) {
$this->storage[$string] = $this->buildManuals[$string]();
}
return $this->storage[$string];
}
When Im entering the following URI he makes a TeamController onject I have tested it.
But he prints out the number 4 in UI for what ever reason. Why is this happening?
This is my TeamController class btw
namespace App\Team;
use App\Core\AbstractController;
use App\Team\TeamRepository;
class TeamController {
public $name ="test";
// public function __construct(Teamrepository $teamRepo)
// {
// $this->teamRepo = $teamRepo;
// }
public function hi() {
echo "hi";
}
// public function showTeampage() {
// $teammembers = $this->teamRepo->fetchAll();
// $this->render($this->teamRepo->getTableName(),
// [
// 'params'=>$teammembers
// ]);
// }
}
This is the viewfield for the team:
<?php require __DIR__."../../../Components/Head.php"; ?>
<p>Hi im the team view</p>
<!-- TODO: display the team data in a beautiful way -->
<?php foreach($params as $teammember): ?>
<p>
<!-- <?php echo $teammember->firstname ?> -->
</p>
<?php
endforeach;
?>
<?php require __DIR__."../../../Components/Footer.php"; ?>
And this is the Components/Head.php:
<?php
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap#5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<title>The company</title>
</head>
<body>

Related

PHP Custom Class error [duplicate]

This question already has answers here:
Reference - What does this error mean in PHP?
(38 answers)
Closed 5 years ago.
Hello for an easy data handling I though of creating a class but I think I must have missed something as it stops the page from loading when I include it.
I think that the error must be something very simple but I don't have much experience in coding in php so if someone could point me in the direction of the mistake and give me an idea of what to implement to resolve this issue.
Like said above in this scenario it will ouput the page until test and then it wont put the rest.
index.php:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-type" content="text/html; charset=UTF-8">
</head>
<body>
<p>test</p>
<?php include("class_lib.php"); ?>
<p>test2</p>
</body>
</html>
class_lib.php:
<?php
class MyAbility{
var $Name;
var $URL;
var $Level1;
var $Level2;
var $Level2;
var $Level4;
var $Level5;
function set_Name($new_name) {
$this->Name = $new_name;
}
function get_Name() {
return $this->Name;
}
function set_URL($new_URL) {
$this->URL = $new_URL;
}
function get_URL() {
return $this->URL;
}
function set_Level1($new_Level1) {
$this->Level1 = $new_Level1;
}
function get_Level1() {
return $this->Level1;
}
function set_Level2($new_Level2) {
$this->Level2 = $new_Level2;
}
function get_Level2() {
return $this->Level2;
}
function set_Level3($new_Level3) {
$this->Level3 = $new_Level3;
}
function get_Level3() {
return $this->Level3;
}
function set_Level4($new_Level4) {
$this->Level4 = $new_Level4;
}
function get_Level4() {
return $this->Level4;
}
function set_Level5($new_Level5) {
$this->Level5 = $new_Level5;
}
function get_Level5() {
return $this->Level5;
}
}
?>
Declared twice my friend :-)
var $Level2;
https://phpcodechecker.com/
More about forcing to print out the error.
http://www.ronaldpringadi.com/archives/introduction-to-logging-and-tracing-in-php/

Load html/php template function

I just go to the point.
Nvm need to add more text to much code..
Trying to load a Template with php inside it but php prints in html instead.
Init.php
class Init {
public static $ROOT = '';
public static $TEMPLATE = '';
public static $SERVICE = '';
public static function start() {
// Init Paths
Init::$ROOT = str_replace("\\", "/", __DIR__);
Init::$TEMPLATE = Init::$ROOT . "/Template/";
Init::$SERVICE = Init::$ROOT . "/Service/";
// Init Template.php class
require_once(Init::$SERVICE . "Template.php");
// Load template Top.php
$top = new Template(Init::$TEMPLATE . "Layout/Top.php");
echo $top->load(); // Show Top.php
}
}
Top.php
<!DOCTYPE html>
<html>
<?
// Load template Head.php
$head = new Template(Init::$TEMPLATE . "Layout/Head.php");
$head->set("TITLE", "Dashboard"); //Set [#TITLE] to Dashboard
$head->load(); // Show Head.php
?>
</html>
Head.php
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>[#TITLE] | cwEye</title> <!-- [#TITLE] will be Dashboard-->
<?
echo "Hello"; // ERROR -> This will print <? echo"Hello"; ?> in my page
?>
</head>
Template.php
<?
class Template {
protected $file;
protected $values = array();
private static $templateFile = null;
public function __construct($file) {
$this->file = $file;
}
public function set($key, $value) {
$this->values[$key] = $value;
}
// This code works but it will not load php inside
public function load() {
if (!file_exists($this->file)) return "Error loading template file ($this->file).";
ob_start();
include_once($this->file);
$data = ob_get_clean();
foreach ($this->values as $key => $value) {
echo str_replace("[#$key]", $value, $data);
}
if(count($this->values) == 0) echo $data;
}
}
?>
Ive played with allot of functions to make it but it does not work...
It just prints the php in html.
Tried with
ob_start();
include_once(FILE);
$data = ob_get_clean();
Don't use short tags like <? or <?=, use <?php instead. You probably have your short_open_tag set to false in php.ini. If you are using PHP 7 then you should know short tags were removed completely and wont work anymore.
In head.php use the full tag. Change
to
<?php echo "hello"; ?>

Passing variables between php pages

I'm new to the Kohana Framework. I have a problem - How can I pass the variable $title from Layout.php to Head.php?
In controller:
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Admin_Quanly extends Controller_Template {
public $template='admin/layout';
function _showWithTemplate($subview,$title)
{
$admin_path = 'admin/';
$this->template->head = View::Factory(''.$admin_path.'head');
$this->template->subview = View::Factory(''.$admin_path.''.$subview.'');
$this->template->title = $title;
}
public function action_index()
{
$this->_showWithTemplate('subview/home','Trang quản trị hệ thống');
}
}
In view Layout.php:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<?php echo $head?>
</head>
<body>
</body>
</html>
In view Head.php:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title><?=$title?></title>
<base href="<?=URL::base()?>">
<link rel="stylesheet" type="text/css" href="style.css" />
<script type="text/javascript" src="javascript/jquery.min.js"></script>
<script type="text/javascript" src="javascript/ddaccordion.js"></script>
You could do something like this:
$admin_path = 'admin/';
$this->template->head = View::Factory(''.$admin_path.'head');
$this->template->head->title = $title;
$this->template->subview = View::Factory(''.$admin_path.''.$subview.'');
$this->template->title = $title;
Note the $this->template->head->title = $title; you need to pass it along manually to the head view.
You can use set() or bind(). See example:
$view = View::factory('user/roadtrip')
->set('places', array('Rome', 'Paris', 'London', 'New York', 'Tokyo'));
->bind('user', $this->user);
Ref: http://kohanaframework.org/3.3/guide/kohana/mvc/views
What you are looking for is set_global
http://docs.kohanaphp.com/core/view#set_global
It will allow you to set a variable for all your views to be able to use. You won't be passing it per say but it will still do what you want.
Example fix
function _showWithTemplate($subview,$title)
{
$admin_path = 'admin/';
$this->template->head = View::Factory(''.$admin_path.'head');
$this->template->subview = View::Factory(''.$admin_path.''.$subview.'');
$this->template->set_global('title', $title);
}

How do I access $_SESSION in an included file?

Here is my code:
My root directory is: root
An index.php file located at the root/index.php
<?php
require_once('root/includes/initialize.php');
<?php template('header.php', 'TITLE');?>;
?>
<div id="main">
//SOME CONTENT
</div>
My initialize.php file gets all my core include files and puts them into one "require_once". Located in root/includes/initialize.php
<?php
//Define Path
defined('LIB_PATH') ? null : define('LIB_PATH', 'root/includes/');
//Core Functions
require_once(LIB_PATH.'functions.php');
//Core Objects
require_once(LIB_PATH.'_database.php');
require_once(LIB_PATH.'_session.php');
//Classes
require_once(LIB_PATH.'_user.php');
?>
updated**
My functions.php file includes a simple templating function that grabs a template file such as my header.php. It is located in root/includes/functions.php
<?php
//Templating
function template($path="", $pageTitle=NULL) {
if ($pageTitle != NULL) {
$_POST['page_title'] = $pageTitle;
}
include(root/public/templates/'.$path);
}
?>
My _session.php file takes care of my session control. Located in root/includes/_session.php
<?php
/**
* Class for Sessions
*/
class Session
{
public $logged_in = FALSE;
public $uid;
function __construct() {
session_start();
$this->check_login();
}
public function check_login() {
if (isset($_SESSION['uid'])) {
$this->uid = $_SESSION['uid'];
$this->logged_in = TRUE;
} else {
unset($this->uid);
$this->logged_in = FALSE;
}
}
public function logged_in() {
return $this->logged_in;
}
public function login($user) {
if ($user) {
$this->uid = $_SESSION['uid'] = $user;
$this->logged_in = TRUE;
}
}
public function logout() {
unset($_SESSION['uid']);
session_unset();
session_destroy();
redirect(WEB_ROOT);
}
}
$session = new Session();
?>
updated**
My header.php holds the top of all the pages in my site. Located in root/public/templates/header.php. This is the file I'm having trouble with, I cant figure out why I am unable to echo out the $session->uid or the $_SESSION['uid'] in this file.
<html>
<head>
<!--CSS-->
<link rel="stylesheet" type="text/css" href="root/public/css/style.css">
<title>MY SITE</title>
</head>
<body>
<div id="header">
<div id="logo">
<?php echo $_POST['page_title'];?>
</div>
<?php echo $session->uid;?> //DOESN'T WORK
</div>
I am able to echo out everything just fine in my index.php file and the other files on my site, but not in the included header.php. Any one know why? Thanks.
session_start() must be called at the start of EVERY php file that is going to either set or get a session variable. The only place I see you calling session_start() is in the one file.
http://www.php.net/manual/en/session.examples.basic.php
<?php
session_start();
if (!isset($_SESSION['count'])) {
$_SESSION['count'] = 0;
} else {
$_SESSION['count']++;
}
?>
Also on a side note. I'm looking at your class Session and I'm not seeing any $mySession = new Session(); anywhere to also start a session.
UPDATE:
I recreated your basic file structure and code in my IDE and got it work by adding this line in the class.
public function check_login() {
if (isset($_SESSION['uid'])) {
$this->uid = $_SESSION['uid'];
$this->logged_in = TRUE;
}
else {
unset($this->uid);
$this->logged_in = FALSE;
$_SESSION['uid'] = session_id();
/*Add this next line */
$this->uid = $_SESSION['uid'];
}
}
The first time I ran index.php just the <?php echo $_SESSION['uid']; ?> part of header worked. Refreshed and <?php echo $session->uid; ?> also worked so it echoed twice. This tells me your class isn't assigning the ID to a class variable, hopefully this is the desired out come as it worked on my end, or you can tweek it as needed.
UPDATE 2:
Function File (edit to match your paths but you need to return a string)
<?php
//Templating
function template($path = "", $pageTitle = NULL) {
if ($pageTitle != NULL) {
$_POST['page_title'] = $pageTitle;
}
return "$path";
}
?>
Then in the Index.php file add this way instead:
<?php
require_once('initialize.php');
include(template('header.php', 'TITLE'));
//include('header.php');
?>
<div id="main">
//SOME CONTENT
</div>
</body>
</html>
_session.php file:
<?php
/**
* Class for Sessions
*/
class Session
{
public $logged_in = FALSE;
public $uid;
function __construct() {
session_start();
$this->check_login();
}
public function check_login() {
if (isset($_SESSION['uid'])) {
$this->uid = $_SESSION['uid'];
$this->logged_in = TRUE;
}
else {
unset($this->uid);
$this->logged_in = FALSE;
$_SESSION['uid'] = session_id();
$this->uid = $_SESSION['uid'];
}
}
public function logged_in() {
return $this->logged_in;
}
public function login($user) {
if ($user) {
$this->uid = $_SESSION['uid'] = $user;
$this->logged_in = TRUE;
}
}
public function logout() {
unset($_SESSION['uid']);
session_unset();
session_destroy();
redirect(WEB_ROOT);
}
}
$session = new Session();
?>
And header.php
<html>
<head>
<!--CSS-->
<link rel="stylesheet" type="text/css" href="style.css">
<title>MY SITE</title>
</head>
<body>
<div id="header">
<div id="logo">
<?php echo $_POST['page_title'];?>
</div>
<?php echo $session->uid; ?> //WORKS NOW
<?php echo $_SESSION['uid']; ?> //WORKS NOW
</div>
The question is pretty vague. My guess would be, that since your index.php file in located in root/index.php, then your include paths:
require_once('root/includes/initialize.php');
include('root/public/templates/header.php');
are incorrect. You don't start with a /, so paths are relative, and considering the location of your index.php, you are including root/root/includes/initialize.php. If that's the case, you should easily spot that by the lack of <title>MY SITE</title> and TITLE on your page. Haven't you?
If that's the problem, I suggest you define some kind of HOME constant, for example
define ('HOME', dirname(__FILE__));
// or define ('HOME', __DIR__); depending on your PHP version
so that you can then include everything relative to that constant
require_once(HOME . '/includes/initialize.php');
Other than that I don't see any errors in your code.

sometime SetCookie() not working

Hi I created two file to switch my forum (Language Chinese and English)
enForum.php
<?php
function foo() {
global $_COOKIES;
setcookie('ForumLangCookie', 'en', time()+3600, '/', '.mysite.com');
echo 'running<br>';
$_COOKIES['ForumLangCookie'] = 'en';
bar();
} // foo()
function bar() {
global $_COOKIES;
if (empty($_COOKIES['ForumLangCookie'])) {
die('cookie_name is empty');
}
echo 'Language =' . $_COOKIES['ForumLangCookie'];
echo "<br>";
} // bar()
foo();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>forum EN Version</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
please be patient ...
<script LANGUAGE='javascript'>
location.href='http://www.mysite.com/forum/index.php';
</script>
</body>
</html>
cnForum.php
<?php
function foo() {
global $_COOKIES;
setcookie('ForumLangCookie', 'cn', time()+3600, '/', '.mysite.com');
echo 'running<br>';
$_COOKIES['ForumLangCookie'] = 'cn';
bar();
} // foo()
function bar() {
global $_COOKIES;
if (empty($_COOKIES['ForumLangCookie'])) {
die('cookie_name is empty');
}
echo 'Language =' . $_COOKIES['ForumLangCookie'];
echo "<br>";
} // bar()
foo();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>forum CN Version</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
please be patient ...
<script LANGUAGE='javascript'>
location.href='http://www.mysite.com/forum/index.php';
</script>
</body>
</html>
There are some files including include template('logon');,include template('regist'); etc, I write some code to get the Cookie value and control the flow to load different template files.
$lang = $_COOKIE["ForumLangCookie"];
// for Debug
// echo '$lang is '.$lang;
// echo '<br/>';
if ($lang == "cn"){
include template('logon');
}
else if ($lang == "en"){
include en_template('logon');
}
But sometime the SetCookie() not working. Do I need add Sleep(someSeconds); for my code?
Cookies can be accessed with $_COOKIE,not $_COOKIES.
EDIT:Sorry for misunderstanding. I suggest you to change the variable $_COOKIES as another common one so people can understand your question correctly.
PHP array name is $_COOKIE, not $_COOKIES

Categories