Я пытаюсь сохранить все файлы PHP, отделенные от файлов HTML. Сортируйте проект на основе шаблонов, но без использования каких-либо движков шаблонов, поскольку они в основном раздуты, и тот факт, что вам нужно будет изучить другой язык, который вообще не является PHP.
Во всяком случае, у меня есть следующий код в моем файле index.php
:
<?php $query = "SELECT id FROM products ORDER by id"; $product_list = ""; if ($stmt = mysqli_prepare($db_conx, $query)) { /* execute statement */ mysqli_stmt_execute($stmt); /* bind result variables */ mysqli_stmt_bind_result($stmt, $id); /* fetch values */ while (mysqli_stmt_fetch($stmt)) { $product_list .= " } } ?> <?php include "template.php"; ?>
И у меня этот код в файле template.php
:
<html> <head> </head> <body> <div class='prod_box'> <div class='center_prod_box'> <div class='product_title'><a href='#'>$product_name</a></div> <div class='product_img'><a href='#'><img src='images/" . $id . "Image1.jpg' alt='' border='0' /></a></div> <div class='prod_price'><span class='reduce'>350$</span> <span class='price'>270$</span></div> </div> <div class='prod_details_tab'> <a href='#' class='prod_buy'>Add to Cart</a> <a href='#' class='prod_details'>Details</a> </div> </div> </body> </html>
Когда я запускаю код, я в основном получаю HTML-страницу, отображаемую точно так же, как вы видите ее выше. Таким образом, данные из базы данных MySQL не отображаются!
РЕДАКТИРОВАТЬ:
Я пробовал использовать следующий код в моем цикле while и все тот же:
$id = $row["id"]; $product_name = $row["product_name"]; $price = $row["price"]; $shipping = $row["shipping"]; $category = $row["category"];
Может кто-то, пожалуйста, помогите мне с этим?
Вам нужно использовать функцию extract()
в PHP, чтобы получить эту информацию. Затем он начнет работать как архитектура контроллера – View, которую вы ищете.
Например:
<?php $query = "SELECT id FROM products ORDER by id"; $product_list = ""; if ($stmt = mysqli_prepare($db_conx, $query)) { /* execute statement */ mysqli_stmt_execute($stmt); /* bind result variables */ mysqli_stmt_bind_result($stmt, $id); /* fetch values */ while (mysqli_stmt_fetch($stmt)) { $product_list .= ""; } } $data['product_list'] = $product_list; $view = 'template.php'; loadTemplate($view, $data); function loadTemplate($view, $data) { extract($data); include($template); } ?>
Затем напрямую используйте $product_list
в разделе просмотра. Это должно сделать это.
Рабочий пример:
<?php $data['test'] = 'This is a working example'; $view = 'workingExampleView.php'; loadTemplate($view,$data); function loadTemplate($viewName,$viewData) { extract($viewData); include($viewName); } ?>
Создайте новый файл, называя его workExampleView.php:
<html> <body> <span><?php echo $test; ?></span> </body> </html>
Я бы предложил использовать шаблонную систему для анализа вашего файла шаблона.
Просто что-то быстрое и грязное:
class Example { // This will be used to save all the variables set trough the set() function within the class as an array private $variables = array(); function set($name,$value) { // Here we are going to put the key and value in the variables array $this->variables[$name] = $value; } function Template($file) { // First set the file path of the template, the filename comes from the Template({filename}) function. $file = '/templates/'.$file.'.php'; // Here we are going to extract our array, every key will be a variable from here! extract($this->variables); // Check if it is actually a file if (!is_file($file)) { throw new Exception("$file not found"); // Check if the file is readable } elseif(!is_readable($file)) { throw new Exception("No access to $file"); } else { // if both are fine we are going to include the template file :) include($file); } } }
и используйте его так:
$class = new Example; $class->set("data", $data); // like passing a name: $class->set("user", $username); $class->Template("filename");
Затем в файле шаблона вы можете использовать $data
и $user
с их содержимым.
Кроме того, в вашем файле шаблона вы не показываете переменную, потому что она не находится между метками PHP. Вот два примера для вас, один короткий, а другой в обычном формате:
<?=$productname?> // or : <?php echo $productname; ?>
О, и вы на самом деле ничего не делаете здесь:
while (mysqli_stmt_fetch($stmt)) { $product_list .= " } }
Вам НЕОБХОДИМО закрыть закрытие "
с ";
и ничего не добавляется в $product_list
.
В index.php
<?php $query = "SELECT id FROM products ORDER by id"; $product_list = ""; if ($stmt = mysqli_prepare($db_conx, $query)) { /* execute statement */ mysqli_stmt_execute($stmt); /* bind result variables */ mysqli_stmt_bind_result($stmt, $id); /* fetch values */ } define("PRODUCT_NAME",$row["product_name"]); define("PRODUCT_ID",$row["id"]); define("PRODUCT_PRICE",$row["price"]); define("PRODUCT_SHIPPING",$row["shipping"]); define("PRODUCT_CATEGORY",$row["category"]); ?> <?php include "template.php"; ?>
и в template.php
<html> <head> </head> <body> <div class='prod_box'> <div class='center_prod_box'> <div class='product_title'><a href='#'><?=PRODUCT_NAME?></a></div> <div class='product_img'><a href='#'><img src='images/<?=PRODUCT_ID?>/Image1.jpg' alt='' border='0' /></a></div> <div class='prod_price'><span class='reduce'>350$</span> <span class='price'>270$</span></div> </div> <div class='prod_details_tab'> <a href='#' class='prod_buy'>Add to Cart</a> <a href='#' class='prod_details'>Details</a> </div> </div> </body> </html>
Ваш код немного беспорядок, вам нужно вернуться к основам: ваш оператор возвращает $id
а не $product
как вы упомянули. Чтобы вернуть что-либо из базы данных, в файле template.html
выполните:
<html> <body> <!-- More html here ... --> <div class='product_title'> <!-- Return value like this --> <a href='#'><?php echo $product_name; ?></a> </div> </body> </html>
Убедитесь, что вы сначала проверяете значение.
Честно говоря, вы должны использовать систему шаблонов . Если вы не хотите препятствовать изучению того, как они работают, существует очень простой подход: создать очень простой. Это понадобится вам рано или поздно. Решение ниже должно быть очень простым, и оно копируется.
Основная операция такой системы заключается в том, что вы:
Примерный класс, который очень легко понять, может быть следующим:
class HtmlPage { private $html; # Loads specified template file into $html public function Load($template) { if (!file_exists($template)) { echo "Specified template ($template) does not exist."; return false; } $this->html = file_get_contents($template); return true; } # Takes in an array of data, key is the placeholder replaced, value is the new text public function Process($data_array) { if (!is_array($data_array)) return; foreach ($data_array as $search => $replace) { # Add brackets so they don't have to be manually typed out when calling HtmlPage::Process() $search = "{$search}"; $this->html = str_replace($search, $replace, $this->html); } } # Returns the page public function GetHtml() { return $this->html; } }
Может использоваться как:
$page_title = "My fancy page title"; $page_text = "All your base are belong to us."; $page = new HtmlPage(); $page->Load('html/templates/mypage.html'); $page->Process(array( 'TITLE' => $page_title, 'TEXT' => $page_text )); echo $page->GetHtml();
Вышеприведенный код заменит
<html> <head> {TITLE} </head> <body> <p>{TEXT}</p> </body> </html>
… до …
<html> <head> My fancy page title </head> <body> <p>All your base are belong to us.</p> </body> </html>
В вашем случае это будет работать следующим образом:
HTML / шаблоны / продукта item.html:
<div class='prod_box'> <div class='center_prod_box'> <div class='product_title'> <a href='#'>{PRODUCT_NAME}</a> </div> <div class='product_img'> <a href='#'><img src='images/{PRODUCT_ID}/Image1.jpg' alt='' border='0' /></a> </div> <div class='prod_price'> <span class='reduce'>{PRODUCT_PRICE_REDUCE}</span> <span class='price'>{PRODUCT_PRICE}</span> </div> </div> <div class='prod_details_tab'> <a href='#' class='prod_buy'>Add to Cart</a> <a href='#' class='prod_details'>Details</a> </div> </div>
PHP-код:
<?php $query = "SELECT * FROM products ORDER by id"; $product_list = ""; if ($stmt = mysqli_prepare($db_conx, $query)) { /* execute statement */ mysqli_stmt_execute($stmt); /* bind result variables */ mysqli_stmt_bind_result($stmt, $id); /* fetch values */ $result = mysqli_stmt_get_result($stmt); while ($product = mysqli_fetch_array($result)) { $product_html = new HtmlPage(); $product_html->Load('html/templates/product-list.html'); $product_html->Process(array( 'PRODUCT_NAME' => $product['name']; 'PRODUCT_ID' => $product['id']; 'PRODUCT_PRICE' => $product['price']; 'PRODUCT_PRICE_REDUCE' => $product['price_reduce']; )); $product_list .= $product_html->GetHtml(); } }