2014-01-04 4 views
0

В этой новой системе, которую я сейчас пишу (изучая PHP), я пытался использовать подготовленные операторы, но не смог найти пример, который позволил мне заставить этот кусок кода работать. Проведя некоторое значительное время на это, я написал его без подготовленных заявлений (иначе я все равно застрял бы).Пример подготовленных заявлений

Однако, если бы кто-нибудь был достаточно любезен, чтобы рассказать мне о том, как я достиг бы той же функциональности, используя подготовленные заявления, это было бы здорово. Я использую подготовленные заявления для INSERT s и UPDATE, но не удалось заставить их работать, используя SELECT.

Этот фрагмент кода является страницей AJAX для заполнения раскрывающегося списка на основе выбора на странице.

Вот код:

<?php 
require_once('assets/includes/config.php'); 

if ((!isset($_GET['cat']) || !is_numeric($_GET['cat'])) && (!isset($_GET['subcat']) || !is_numeric($_GET['subcat']))) 
    $response = array('success' => FALSE); 
else { 
    $conn = mysqli_connect($config["db"]["host"],$config["db"]["dbname"],$config["db"]["password"],$config["db"]["username"]); 
    $cat= mysqli_real_escape_string($conn, $_GET['cat']); 
    $subcat= mysqli_real_escape_string($conn, $_GET['subcat']); 
    $sql = "SELECT * FROM jf_data WHERE cat = $cat and subcat = $subcat;"; 
    $result = mysqli_query($conn,$sql); 
    $options = ""; 

    while($row = mysqli_fetch_array($result)) { 
     $options .= '<option value="'. $row['id'] .'">'. $row['data'].'</option>'; 
    } 
    $response = array(
     'success' => TRUE, 
     'options' => $options 
    ); 
    } 

header('Content-Type: application/json'); 
echo json_encode($response); 
?> 

ответ

2

Я дам этот водоворот:

$conn = mysqli_connect($config["db"]["host"],$config["db"]["username"],$config["db"]["password"],$config["db"]["dbname"]); 

$cat = $_GET['cat']; 
$subcat = $_GET['subcat']; 
$options = ''; 

$sql = "SELECT id,data FROM jf_data WHERE cat = ? and subcat = ?;"; 

if($stmt = mysqli_stmt_prepare($conn,$sql)){ 
    mysqli_stmt_bind_param($stmt,'ss',$cat,$subcat); 
    mysqli_stmt_execute($stmt); 
    mysqli_stmt_bind_result($stmt,$id,$data); 

    while(mysqli_stmt_fetch($stmt)){ 
     $options .= '<option value="' . $id . '">' . $data . '</option>'; 
    } 

    mysqli_stmt_close($stmt); 
} 

$response = array(
    'success' => TRUE, 
    'options' => $options 
); 

Вот список вопросов и ответов:

  • Почему бы» Мне нужно очистить свои статусы $_GET? - привязка позаботится обо всем этом, вам не нужно выходить из строя (что никогда не срабатывало)
  • Что такое mysqli_stmt_bind_param? - те элементы, которые вам нужно включить: выполняемая инструкция, типы данных в порядке вопросительного знака ('ss' - строка, строка), переменная 1, переменная 2 (переменные в порядке вопросительного знака)
  • Что такое mysqli_stmt_bind_result вещи? - Это данные, которые вы возвращаете. Заметьте, что я не делал SELECT * (что это ужасная идея в любом случае, всегда указывать столбцы), я только необходимы два элемента, которые затем привязку к результату переменных $id и $data, что я создал
  • Где все $row массив, к которому я привык? - Все прошло! Связанные утверждения не идут на основе строк с использованием MYSQLI_ASSOC или чего-то странного, просто прямые переменные
  • Почему вы закрываете свое заявление? - потому что вы всегда должны. всегда.

Я не собираюсь воспринимать как среднее или что-то еще, это комбинации вопросов, которые у меня были, когда я только начинал, и вопросы, которые я встречал, когда объясняли это другим. Просто подумал, что я бы дал хороший исходный исход. Еще одна хорошая проверка - read the documentation, в которой всегда есть примеры того, как это реализовать (перейдите к процедурному стилю, пример № 2).

Надеюсь, это поможет!

EDIT: советы соединения

Лично мне нравится держать мою установку соединения в отдельном файле, так что я могу просто добавить потребуем вместо сохранения кода на разных страницах. Вы настроили его в массиве, но применяется одна и та же логика.Обычно я создал отдельный mysqli_[appname]_SUID.php файл (для пользователей, которые имеют полный доступ SUID), как это:

$host="localhost"; 

if($_SERVER['HTTP_HOST'] === 'www.domain.com'){ // production DB 
    $username="production_user"; 
    $password="production_password"; 
    $db_name="production_db"; 
} else { // dev or stage DB 
    $username="dev_user"; 
    $password="dev_password"; 
    $db_name="dev_db"; 
} 

$conn = mysqli_connect($host,$username,$password,$db_name); 

Это позволяет довольно легко изменять, и всякий раз, когда вы должны использовать его, просто добавьте в требуют:

require_once 'requires/mysqli_[appname]_SUID.php'; 

И вы в порядке. Не уверен, что это тоже помогает, просто моя практика.

+0

Спасибо. Определенно не означает. Полезные вопросы (и ответы). Пример будет полезен для повторного использования позже. – Graeme

+0

Хотя я получаю это: Warning: mysqli_stmt_prepare() ожидает, что параметр 1 будет mysqli_stmt, объект указан в xxx в строке 15 - это строка «if ($ stmt» – Graeme

+0

@Graeme - извините, этого не заметили раньше , ваш оператор 'mysqli_connect()' вышел из строя. Он должен пойти 'mysqli_connect ($ host, $ user, $ password, $ database);' я обновил свой ответ с правильным порядком и ссылку на документацию с примерной настройкой. – PlantTheIdea

Смежные вопросы