Intereting Posts
Две команды успешно выполняются вручную, но не выполняются при запуске в shell_exec (), что дает ошибку TimeOut Как я могу использовать различные XML-библиотеки PHP для получения DOM-подобных функций и предотвращения уязвимостей DoS, таких как Billion Laughs или Quadratic Blowup? Создание тега по умолчанию из пустого значения генерируется, когда тег отсутствует. Как разрешить? апостроф вроде и равное положение не работает Сравнение двух адресов электронной почты в PHP / MySQL всегда возвращает false Zend Framework, как настроить заголовки php трещотка websocket SSL connect? Проблемы с пространством имен PHP Простая проблема кодирования символов html dom Как преобразовать приложение php & jqueryMobile в файл apk Отслеживание исходящих ссылок с помощью Javascript и PHP приглашать друзей в диалог в приложении Facebook MySQL, PHP, JavaScript UTF-8 Проблема с шведскими буквами (все протестировано – ничего не работает) Разбор SOAP-ответа с PHP по-разному серийный модем для набора номера из php

Хранение HTML-файлов, отделенных от файлов PHP (на основе шаблонов)

Я пытаюсь сохранить все файлы 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> 

Убедитесь, что вы сначала проверяете значение.

Честно говоря, вы должны использовать систему шаблонов . Если вы не хотите препятствовать изучению того, как они работают, существует очень простой подход: создать очень простой. Это понадобится вам рано или поздно. Решение ниже должно быть очень простым, и оно копируется.

Основная операция такой системы заключается в том, что вы:

  1. Загрузите файл шаблона с помощью строк-заполнителей.
  2. Обработать файл шаблона (заменить заполнители фактическими значениями).
  3. Вывод (или возврат) 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(); } }