Преобразовать в mysqli подготовленные операторы из процедурных

Мне нужна помощь со следующим кодом, чтобы изменить его с процедурного на подготовленный оператор. Я сделаю все возможное, чтобы закодировать его:

Процедурный скрипт по умолчанию MYSQLI по умолчанию

<?php
$conn = mysqli_connect ('localhost', 'gggggg', 'gggggg') ; 
mysqli_select_db ($conn, 'ggggg'); 

$anti_injection = mysqli_real_escape_string($_GET['user']);

$sql = "SELECT * FROM profiles WHERE username =".$anti_injection);
$result = mysqli_query($conn, $query);

while($row = mysqli_fetch_array($sql)) {

$username = stripslashes($row['username']);
$age = stripslashes($row['age']);
$gender = stripslashes($row['gender']);
?>


<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>title</title>
</head>

<body>
CUSTOM HTML FOR A NICE DESIGN I WANT TO KEEP THE SAME DESIGN LAYOUT ETC...

    CATEGORY <?php echo $username; ?>
    TITEL <?php echo $age; ?>
    CONTENT <?php echo $sex; ?>

</body>
</html>
<?php
}
?>
#

ТЕПЕРЬ МОИ ИЗМЕНЕНИЯ В ЗАЯВЛЕНИЯХ НАДЕЮСЬ, ЭТО РАБОТАЕТ

#
$query = $sql->prepare("SELECT * FROM profiles WHERE `username`=?")
$prep->bind_param("s",$anti_injection);
$prep->execute();

Это все, что я знаю о SELECT в безопасном режиме, но тогда с MYSQLI_FETCH_ARRAY я действительно не знаю, что это сработает, и, надеюсь, если есть шанс сохранить скрипт так, как мне нравится, с эхом между страницей HTML BODY

Некоторый пример того, как это должно быть сделано?


person Firefighter    schedule 13.01.2014    source источник
comment
Интересно, что такое переменная $prep?   -  person Shady Atef    schedule 13.01.2014
comment
php.net/manual/en/mysqli.quickstart.prepared- заявления.php   -  person Emilio Gort    schedule 13.01.2014
comment
даже я этого не знаю. Я просто скопировал их из другого примера и безуспешно пытаюсь понять, как это делается :(   -  person Firefighter    schedule 13.01.2014
comment
Я просто пытаюсь учиться, ребята. Ответ от Эмилио не очень помог, потому что он показывает, как это делать для экспертов, но новички, такие как я, не поймут с такими примерами, поэтому я создал пост со своим примером, чтобы узнать и понять, что я изучаю.   -  person Firefighter    schedule 13.01.2014


Ответы (4)


Во-первых, я настоятельно рекомендую не смешивать процедурные объекты с объектами. Так будет гораздо быстрее запутаться. Вместо этого рассмотрите возможность использования объекта mysqli.

$mysqli = new mysqli('localhost'...);

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

$prep = $mysqli->prepare("SELECT * FROM profiles WHERE `username`=?");
$prep->bind_param("s",$anti_injection);
$prep->execute();

Теперь следующая часть сложная. Для этого у вас должен быть установлен mysqlnd, но это лучший способ вернуть результаты. Если вы запустите это и получите сообщение об отсутствии get_result, вы не используете mysqlnd

$result = $prep->get_result();
while($row = $result->fetch_array()) {
    //Your HTML loop here
} 
person Machavity♦    schedule 13.01.2014
comment
Я постараюсь узнать, включен ли он, ty m8 - person Firefighter; 13.01.2014
comment
Неудача Неустранимая ошибка: вызов неопределенного метода mysqli_stmt::get_result() в - person Firefighter; 13.01.2014
comment
Тогда большой облом. Если вы не можете изменить свою серверную среду, вам придется использовать значительно более громоздкий bind_result - person Machavity♦; 13.01.2014

Я предоставляю сценарий, основанный на вашем, который я прокомментировал, протестировал и использует процедурный «mysqli». Надеюсь, это прояснит ситуацию.

<?php
/* (PHP 5.3.18 on XAMPP, windows XP)
 *
 * I will use the procedural 'mysqli' functions in this example as that is
 * what you seem familiar with.
 *
 * However, the 'object oriented' style is preferred currently.
 *
 * It all works fine though :-)
 *
 * I recommend PDO (PHP Data Objects) as the way to go for Database access
 * as it provides a 'common' interface to many database engines.
 */


// this is an example 'select' parameter -- how this value gets set is up to you...
// use a form, get parameter or other, it is not important.

$bindparamUsername = 'user_2'; // example!!!!

// connect to the database...
$dbConnection = mysqli_connect('localhost', 'test', 'test'); // connect
mysqli_select_db($dbConnection, 'testmysql'); // my test database


// the SQL Query...

// the '?' is a placeholder for a value that will be substituted when the query runs.
// Note: the ORDER of the selected Columns is important not the column names.
//
// Note: The number of selected columns is important and must match the number of
// 'result' bind variables used later.

$sql = "SELECT username, age, gender FROM profiles WHERE username = ?";

// DB engine: parse the query into an internal form that it understands
$preparedQuery = mysqli_prepare($dbConnection, $sql);

// bind an actual input PHP variable to the prepared query so the db will have all required values
// when the query is executed.
//
mysqli_stmt_bind_param($preparedQuery, 's', $bindparamUsername);

// run the query...
$success = mysqli_execute($preparedQuery);


// You can only bind which variables to store the result columns in AFTER the query has run!
//

// Now bind where any results from the query will be returned...
// There must be as many 'bind' variables as there are selected columns!
// This is because each column value from the query will be returned into the 
// 'bound' PHP variable. 
//
// Note: You cannot bind to an array. You must bind to an individual PHP variable.
//
// I have kept the same names but they are only of use to you.
$fetchedRow = array( 'username' => null,
                     'age'      => null,
                     'gender'   => null);


/*
 *  Note: order of columns in the query and order of destination variables in the       'bind' statement is important.
 *  
 *  i.e. $fetchedRow[username] could be replaced with variable $firstColumn,
 *       $fetchedRow[age] could be replaces with variable $secondColumn
 *   and so on...  
 *     
 * There must be as many bind variables as there are columns.             
 */   
mysqli_stmt_bind_result($preparedQuery, $fetchedRow['username'],
                                        $fetchedRow['age'],
                                        $fetchedRow['gender']);

 /*
 * Note: if you use the 'Object Oriented' version of 'mysqli': All of this is 'hidden'
 *       but still happens 'behind the scenes'!
 *
 */
?>

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title></title>
  </head>
  <body>
    CUSTOM HTML FOR A NICE DESIGN I WANT TO KEEP THE SAME DESIGN LAYOUT ETC...

    <?php // each 'fetch' updates the $fetchedRow PHP variable... ?>
    <?php while (mysqli_stmt_fetch($preparedQuery)): ?>
      <br />
        CATEGORY <?php echo $fetchedRow['username']; ?>
      <br />
      TITEL <?php echo $fetchedRow['age']; ?> <br />
      CONTENT <?php echo $fetchedRow['gender']; ?> <br />
    <?php endwhile ?>

  </body>
</html>
person Ryan Vincent    schedule 13.01.2014
comment
Я проверю это, но выглядит действительно интересно и легко понять, большое спасибо за ваше время - person Firefighter; 13.01.2014

Если вы учитесь, я рекомендую вам использовать Object Oriented Style

Руководство — это первый ресурс, где вы можете найти самая точная информация. По вашему примеру:

$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

//Here you avoid the warning undefine variable if $_GET['user'] ins't set
$user = isset($_GET['user']) ? $_GET['user'] : NULL;
$row = array();

//Checking if $user is NULL
if(!empty($user)){
   // Prepared statement, stage 1: prepare 
   if (!($stmt = $mysqli->prepare("SELECT * FROM profiles WHERE `username`=?"))) {
     echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
   }
   /* Prepared statement, stage 2: bind and execute */
   if (!$stmt->bind_param("s", $user)) {
     echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
   }
   if (!$stmt->execute()) {
     echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
   }
  //Fetching the result
  $res = $stmt->get_result();
  $row = $res->fetch_assoc();
  /* explicit close recommended */
  $stmt->close();
}else{
//do this code if $user is null
}


//Printing out the result
echo '<pre>';
print_r($row);
echo '</pre>';
person Emilio Gort    schedule 13.01.2014

ты можешь сделать это так

$link = mysqli_connect("localhost", "my_user", "my_password", "db"); //Establishing connection to the database , this is alias of new mysqli('')
$query="SELECT * FROM profiles WHERE `username`=?";
$stmt = $link->prepare($query);
$stmt->bind_param("s",$anti_injection); // binding the parameter to it
$stmt->execute(); //Executing
$result = $stmt->get_result();
while($row = $result->fetch_array(MYSQLI_ASSOC)) // we used MYSQLI_ASSOC flag here you also can use MYSQLI_NUM or MYSQLI_BOTH
{
//Do stuff
}
person Shady Atef    schedule 13.01.2014
comment
Я проверю это прямо сейчас, интересно, почему #query=SELECT * FROM profiles WHERE username=? вы редактировали с помощью символа # - person Firefighter; 13.01.2014
comment
Пробовал, и даже Dreamweaver выдает ошибку при выборе аналогичного запроса из профилей... Кажется, что какой-то символ отсутствует - person Firefighter; 13.01.2014
comment
Я уверен, что в нем нет синтаксических ошибок. Также, согласно вашим комментариям к @Machavity, ваш сервер имеет php ниже 5.3, так как get_result поддерживается для php ›= 5.3 - person Shady Atef; 13.01.2014
comment
Для справки, ваше соединение является процедурным, а ваши последующие вызовы mysqli являются объектно-ориентированными. Старайтесь использовать все так или иначе. - person mickmackusa; 11.05.2018