Php mysql pdo query: заполнить переменную с результатом запроса

У меня есть веб-сайт, чтобы легко создавать пользователей ProFTPD. И теперь я защищаю свой сайт от атак SQL-инъекций, чтобы сделать это, я меняю все запросы mysqli на pdo-запросы с помощью подготовленных операторов.

Но я все еще не мог узнать, как сохранить результаты запроса sql в переменной.

. . . username=$_POST['username']; . . . $pdo = new PDO('mysql:host=localhost;dbname='db', 'root', 'PW'); $query1= $pdo->prepare('select * from users where userid=:username'); $query1->execute(array('username' => $username)); foreach($query1 as $row) { $result= $row->userid; } if($result == $username) { echo "Username is already taken"; } 

Когда я запускаю этот код, переменная $ result является emtpy.

Надеюсь, кто-то может мне помочь.

Заранее спасибо.

Related of "Php mysql pdo query: заполнить переменную с результатом запроса"

Вы должны использовать PDOStatement :: fetch http://php.net/manual/en/pdostatement.fetch.php

Даже если у вас уже есть решение, вы можете найти полезный пример использования подготовленных инструкций PDO вместе с обработкой исключений:

Заметки:

  • Не извлекайте все поля, а просто userid . Ограничение выборки только одной записью.
  • Всегда используйте обработку исключений, чтобы улавливать и немедленно обрабатывать исключения.
  • Всегда используйте подготовленные инструкции, чтобы избежать инъекции MySQL.
  • Элементы в выбранном массиве данных адресуются как обычные элементы массива.
  • «functions.php» содержит все необходимые функции и входит в «index.php». Я не дал вам код ООП, но вы должны реализовать его вместо использования простых функций. Мой код служит отправной точкой для вас.

PDO подготовил заявления и обработку исключений в PHP:

index.php:

 <?php require_once 'functions.php'; /* * ---------------- * Database configs * ---------------- */ define('MYSQL_HOST', '...'); define('MYSQL_PORT', '3306'); define('MYSQL_DATABASE', '...'); define('MYSQL_CHARSET', 'utf8'); define('MYSQL_USERNAME', '...'); define('MYSQL_PASSWORD', '...'); /* * ------------------------- * Start program * ------------------------- */ // Activate error reporting (only on development). activateErrorReporting(); try { // Validate user name. if (!isset($_POST['username'])) { throw new Exception('No user name provided!'); } // Get user name. $username = $_POST['username']; // Create db connection. $connection = createConnection( MYSQL_HOST , MYSQL_DATABASE , MYSQL_USERNAME , MYSQL_PASSWORD , MYSQL_PORT , MYSQL_CHARSET ); // Define sql statement. $sql = 'SELECT userid FROM users WHERE userid = :username LIMIT 1'; // Prepare and check sql statement (returns PDO statement). $statement = $connection->prepare($sql); if (!$statement) { throw new Exception('The SQL statement can not be prepared!'); } // Bind values to sql statement parameters. $statement->bindValue(':username', $username, getInputParameterDataType($username)); // Execute and check PDO statement. if (!$statement->execute()) { throw new Exception('The PDO statement can not be executed!'); } // Fetch person details. $fetchedData = $statement->fetchAll(PDO::FETCH_ASSOC); if (!$fetchedData) { throw new Exception('Fetching data failed!'); } closeConnection($connection); } catch (PDOException $pdoException) { // On development. printData($pdoException, TRUE); // On production. // echo $pdoException->getMessage(); exit(); } catch (Exception $exception) { // On development. printData($exception, TRUE); // On production. // echo $exception->getMessage(); exit(); } // For testing purposes. printData($fetchedData, TRUE); if (count($fetchedData) > 0) { echo 'Username is already taken'; } 

functions.php:

 <?php /* * -------------------------------------------------- * Data access functions * -------------------------------------------------- */ /** * Create a new db connection. * * @param string $host Host. * @param string $dbname Database name. * @param string $username Username. * @param string $password Password. * @param string $port [optional] Port. * @param array $charset [optional] Character set. * @param array $options [optional] Driver options. * @return PDO Db connection. */ function createConnection($host, $dbname, $username, $password, $port = '3306', $charset = 'utf8', $options = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_PERSISTENT => true, )) { $dsn = getDsn($host, $dbname, $port, $charset); $connection = new PDO($dsn, $username, $password); foreach ($options as $key => $value) { $connection->setAttribute($key, $value); } return $connection; } /** * Create a mysql DSN string. * * @param string $host Host. * @param string $dbname Database name. * @param string $port [optional] Port. * @param array $charset [optional] Character set. * @return string DSN string. */ function getDsn($host, $dbname, $port = '3306', $charset = 'utf8') { $dsn = sprintf('mysql:host=%s;port=%s;dbname=%s;charset=%s' , $host , $port , $dbname , $charset ); return $dsn; } /** * Close a db connection. * * @param PDO $connection Db connection. * @return void */ function closeConnection($connection) { $connection = NULL; } /** * Get the data type of a binding value. * * @param mixed $value Binding value. * @return mixed Data type of the binding value. */ function getInputParameterDataType($value) { $dataType = PDO::PARAM_STR; if (is_int($value)) { $dataType = PDO::PARAM_INT; } elseif (is_bool($value)) { $dataType = PDO::PARAM_BOOL; } return $dataType; } /* * -------------------------------------------------- * Print functions * -------------------------------------------------- */ /** * Print data on screen. * * @param mixed $data Data to print. * @param bool $preformatted Print preformatted if TRUE, print normal otherwise. * @return void */ function printData($data, $preformatted = FALSE) { if ($preformatted) { echo '<pre>' . print_r($data, true) . '</pre>'; } else { echo $data; } } /* * -------------------------------------------------- * Error reporting functions * -------------------------------------------------- */ /** * Toggle error reporting. * * @param integer $level Error level. * @param bool $display_errors Display errors if TRUE, hide them otherwise. * @return void */ function activateErrorReporting($level = E_ALL, $display_errors = TRUE) { error_reporting($level); ini_set('display_errors', ($display_errors ? 1 : 0)); } 

Попробуйте изменить

 $query1= $pdo->prepare('select * from users where userid=:username'); 

в

 $query1= $pdo->query('select * from users where userid=:username'); 

получить доступ к следующим данным

 foreach($query1 as $row) { $result= $row['userid']; }