Row php что такое

Работа с MySQL в PHP

PHP поддерживает работу с базой данных MySQL.
Специальные встроенные функции для работы с MySQL позволяют просто и эффективно работать с этой СУБД: выполнять любые запросы, читать и записывать данные, обрабатывать ошибки.
Сценарий, который подключается к БД, выполняет запрос и показывает результат, будет состоять всего из нескольких строк. Для работы с MySQL не надо ничего дополнительно устанавливать и настраивать; всё необходимое уже доступно вместе со стандартной поставкой PHP.

Что такое mysqli?

mysqli (MySQL Improved) — это расширение PHP, которое добавляет в язык полную поддержку баз данных MySQL. Это расширение поддерживает множество возможностей современных версий MySQL.

Как выглядит работа с базой данных

Типичный процесс работы с СУБД в PHP-сценарии состоит из нескольких шагов:

Функция mysqli connect: соединение с MySQL

Но чтобы выполнить соединение с сервером, необходимо знать как минимум три параметра:

Базовый синтаксис функции mysqli_connect() :

Проверка соединения

Первое, что нужно сделать после соединения с СУБД — это выполнить проверку, что оно было успешным.
Эта проверка нужна, чтобы исключить ошибку при подключении к БД. Неверные параметры подключения, неправильная настройка или высокая нагрузка заставит MySQL отвеграть новые подключения. Все эти ситуации приведут к невозможности соединения, поэтому программист должен проверить успешность подключения к серверу, прежде чем выполнять следующие действия.

Соединение с MySQL и проверка на ошибки:

Функция mysqli_connect_error() просто возвращает текстовое описание последней ошибки MySQL.

Установка кодировки

Первым делом после установки соединения крайне желательно явно задать кодировку, которая будет использоваться при обмене данными с MySQL. Если этого не сделать, то вместо записей со значениями, написанными кириллицей, можно получить последовательность из знаков вопроса: ‘. ’.
Вызови эту функцию сразу после успешной установки соединения: mysqli_set_charset($con, «utf8»);

Выполнение запросов

Установив соединение и определив кодировку мы готовы выполнить свои первые SQL-запросы. Вы уже умеете составлять корректные SQL команды и выполнять их через консольный или визуальный интерфейс MySQL-клиента.
Те же самые запросы можно отправлять без изменений и из PHP-сценария. Помогут в этом несколько встроенных функций языка.

Два вида запросов

Следует разделять все SQL-запросы на две группы:

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

Добавление записи

Вернёмся к нашему проекту — дневнику наблюдений за погодой. Начнём практическую работу с заполнения таблиц данными. Для начала добавим хотя бы один город в таблицу cities.

Выражение INSERT INTO используется для добавления новых записей в таблицу базы данных.

Функция insert id: как получить идентификатор добавленной записи

Теперь у нас есть всё необходимое, чтобы добавить погодную запись.
Вот как будет выглядеть комплексный пример с подключением к MySQL и добавлением двух новых записей:

Чтение записей

В этом примере показано, как вывести все существующие города из таблицы cities:

Чтобы получить действительные данные, то есть записи из таблицы, следует использовать другую функцию — mysqli_fetch_array() — и передать ей единственным параметром эту самую ссылку.
Теперь каждый вызов функции mysqli_fetch_array() будет возвращать следующую запись из всего результирующего набора записей в виде ассоциативного массива.

Цикл while здесь используется для «прохода» по всем записям из полученного набора записей.
Значение поля каждой записи можно узнать просто обратившись по ключу этого ассоциативного массива.

Как получить сразу все записи в виде двумерного массива

Иногда бывает удобно после запроса на чтение не вызывать в цикле mysqli_fetch_array для извлечения очередной записи по порядку, а получить их сразу все одним вызовом. PHP так тоже умеет. Функция mysqli_fetch_all($res, MYSQLI_ASSOC) вернёт двумерный массив со всеми записями из результата последнего запроса.
Перепишем пример с показом существующих городов с её использованием:

Как узнать количество записей

Источник

mysql_fetch_row

mysql_fetch_row — Обрабатывает ряд результата запроса и возвращает массив с числовыми индексами

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

Описание

Возвращает массив с числовыми индексами, содержащий данные обработанного ряда, и сдвигает внутренний указатель результата вперёд.

Список параметров

Возвращаемые значения

mysql_fetch_row() обрабатывает один ряд результата, на который ссылается переданный указатель. Ряд возвращается в виде массива. Каждая колонка располагается в следующей ячейке массива, начиная с нулевого индекса

Примеры

Пример #1 Получение одного ряда с помощью mysql_fetch_row()

Примечания

Замечание: Эта функция устанавливает NULL-поля в значение null PHP.

Смотрите также

User Contributed Notes 8 notes

to print an array, simply use print_r(array name)

like this:
$myrow = mysql_fetch_row($result);
echo «»;

this will output the array in a readable form, with the index, too. Don’t forget the ‘pre’ tags or the output will be on a single line.

require ‘prhlavicka.php’ ;
pis_hlavicku ( ‘Vypis článků’ );

sry 🙂 note now fixed:

Creates table from all db info:

$query = «SELECT * FROM table»;
$result = mysql_query($query);
$row = mysql_fetch_row($result);

The following function to read all data out of a mysql-resultset, is may be faster than Rafaels solution:

Источник

mysql_num_rows

mysql_num_rows — Возвращает количество рядов результата запроса

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

Описание

Список параметров

Возвращаемые значения

Количество рядов в результате запроса в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysql_num_rows()

Примечания

При использовании mysql_unbuffered_query() функция mysql_num_rows() не вернёт корректного значения до тех пор, пока все ряды не будут получены.

Для обратной совместимости может быть использован следующий устаревший псевдоним: mysql_numrows()

Смотрите также

User Contributed Notes 22 notes

Some user comments on this page, and some resources including the FAQ at :

This is not a particularly universal solution, and those who read these comments on this page should also be aware that

select count(*) may not give correct results if you are using «group by» or «having» in your query, as count(*) is an agregate function and resets eachtime a group-by column changes.

can be an alternative to sub-selects in mysql 3, and such queries cannot have the select fields replaced by count(*) to give good results, it just doesn’t work.

*Early detection of invalid constant expressions. MySQL quickly detects that some SELECT statements are impossible and returns no rows.

*All constant tables are read first, before any other tables in the query. A constant table is:
1) An empty table or a table with 1 row.
2) A table that is used with a WHERE clause on a UNIQUE index, or a PRIMARY KEY, where all index parts are used with constant expressions and the index parts are defined as NOT NULL.

Hopefully this will keep someone from staying up all night with 1146 errors, unless I am completely mistaken in thinking I have this figured out.

This seems the best workaround to get an ‘ordinary’ loop going, with possibility of altering output according to row number
(eg laying out a schedule)

In response to oran at trifeed dot com:

You are only experiencing this behaviour because you have not given your FOUND_ROWS() result an alias:

SELECT SQL_CALC_FOUND_ROWS together with
SELECT FOUND_ROWS()

After all there is an array of row arrays, as signified by
mysql_num_rows($result):

Say this gives «40 rows» : it would be useful to know when the iteration is on row 39.

The nearest seems to be «data seek»:but it connects directly to a
row number eg (from mysql_data_seek page)

= it still wouldn’t solve knowing what row number you’re on in an ordinary loop.

One reason for this situation is the php fetch (fetch-a-single-row) construction, without any reasonable FOR loop possibility with row numbers.

Suggestion:
$Rows[$i] possibility where
$i would be the row number

A note on the following usage; that suggest to use several MySQL Functions to get the number of Table Records.

You may be familiar with following:

= ‘Select SQL_CALC_FOUND_ROWS `MyField` From `MyTable` Limit 1;’ ;

$sqlQuery_1 = ‘Select FOUND_ROWS( );’ ;

?>

I omitted the actual connection to MySQL and the execution of the query, but you get the idea.

I did some tests and on a fairly high traffic web site, one that executes several queries quite often and found that using this combination of MySQL Functions can actually result in wrong results.

For example, assume I have two queries to get the number of Table Records in two different Tables. So in essence, we are executing 4 queries ( 2 queries for each Table ).

If two different requests come in through PHP, your going to run into problems. Note than when I mean request, I mean two different clients requesting your PHP page.

Execute: SQL_CALC_FOUND_ROWS On Table 1

Execute: SQL_CALC_FOUND_ROWS On Table 2

Execute: Select FOUND_ROWS( )

At this point, you see the race condition that occurred. While Request 1 was being executed, Request 2 came in.

At this point Request 1 will return the number of Table Records in Table 2 and not Table 1 as expected!

Why? Because MySQL does not differ between requests. Each query is in a queue waiting its turn. As soon as its turn comes in it will be executed my MySQL.

The MySQL Function Select FOUND_ROWS( ) will return the result of the last SQL_CALC_FOUND_ROWS!

MySQL 4.0 supports a fabulous new feature that allows you to get the number of rows that would have been returned if the query did not have a LIMIT clause. To use it, you need to add SQL_CALC_FOUND_ROWS to the query, e.g.

$sql = «Select SQL_CALC_FOUND_ROWS * from table where state=’CA’ limit 50»;
$result = mysql_query($sql);

$sql = «Select FOUND_ROWS()»;
$count_result = mysql_query($sql);

You now have the total number of rows in table that match the criteria. This is great for knowing the total number of records when browsing through a list.

To use SQL COUNT function, without select the source.

In preventing the race condition for the SQL_CALC_FOUND_ROWS and FOUND_ROWS() operations, it can become complicated and somewhat kludgy to include the FOUND_ROWS() result in the actual result set, especially for complex queries and/or result ordering. The query gets more complex, you may have trouble isolating/excluding the FOUND_ROWS() result, and mysql_num_rows() will return the number of actual results + 1, all of which makes your code messier and harder to read. However, the race condition is real and must be dealt with.

A alternative and cleaner method is to explicitly lock the table using a WRITE lock (preventing other processes from reading/writing to the table). The downsides I can see are a performance hit, and your mysql user must have lock permissions.

// excuse the use of mysqli instead of mysql

Actually I am a little ashamed to be saying this, but I stand corrected about a rather old note I posted on 17-Jul-2007 06:44.

Using SQL_CALC_FOUND_ROWS and FOUND_ROWS( ) will NOT trigger a race condition on MySQL, as that would pretty much defy their entire purpose.

The results for their usage is actually unique per connection session as it is impossible for processes to share anything in PHP. As far as PHP is concerned, each request represents a new connection to MySQL as each request is isolated to its own process.

To simulate this, create the following script:

?>

Set the connection and query information for something that matches your environment.

Run the script once with the Sleep query string and once again without it. Its important to run them both at the same time. Use Apache ab or something similar, or even easier, just open two browser tabs. For example:

If a race condition existed, the results of the first instance of the script would equal the results of the second instance of the script.

For example, the second instance of the script will execute the following SQL query:

( «SELECT SQL_CALC_FOUND_ROWS `aid` From `access` Limit 1» );

?>

This happens while the first instance of the script is sleeping. If a race condition existed, when the first instance of the script wakes up, the result of the FOUND_ROWS( ) it executes should be the number of rows in the SQL query the second instance of the script executed.

But when you run them, this is not the case. The first instance of the script returns the number of rows of its OWN query, which is:

( «SELECT SQL_CALC_FOUND_ROWS `bid` From `blocks` Limit 1» );

?>

So it turns out NO race condition exists, and every solution presented to combat this «issue» are pretty much not needed.

Источник

Запросы в PHP

В предыдущем уроке мы познакомились с основами языка SQL и теперь попробуем применить эти знания на практике.

В качестве первого примера выберем все строки из нашей таблицы:

Для получения отдельной записи из результатов запроса необходимо воспользоваться одной из fetch-функций (функции получения данных). Их несколько и каждая удобна в своём случае.

Функция возвращает объект, содержащий свойства, одноимённые полям результатов запроса. Значения этих свойств всегда текстового типа и равны значению соответствующего поля.

Таким образом, цикл перебора всех записей будет выгядеть так:

Иногда возникает необходимость передвигаться по записям не только «вперёд», но и «назад», т.е. по направлению от текущей строки к первой. В этом случае надо использовать функцию mysql_data_seek(), которая позволяет перейти к записи с заданным номером.

Значение номера строки должно быть в диапазоне от 0 до количества строк в результатах запроса. Количество строк можно узнать при помощи функции mysql_num_rows (). С учётом этого, можно переписать предыдущий пример в более безопасной форме:

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

Обязательная проверка всех данных перед занесением в таблицу не только является признаком «хорошего тона» среди программистов, но и является насущной необходимостью для защиты сайта от взлома и хищения данных.

При написании сложных запросов лучше всего предварительно запрос испытать при помощи сторонних программ, а только потом добавлять его в код. Такой подход существенно облегчает тестирование как запроса, так и скрипта в целом.

Источник

PDOStatement::rowCount

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDOStatement::rowCount — Возвращает количество строк, затронутых последним SQL-запросом

Описание

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество строк.

Примеры

Пример #1 Получение количества удалённых строк

PDOStatement::rowCount() возвращает количество строк, изменённых выражениями DELETE, INSERT или UPDATE.

Результатом выполнения данного примера будет что-то подобное:

Пример #2 Подсчёт строк, возвращаемых выражением SELECT

Для большинства СУБД PDOStatement::rowCount() не возвращает количество строк, затронутых SELECT запросом. Вместо этого метода запустите через PDO::query() выражение SELECT COUNT(*) с тем же текстом запроса. Затем методом PDOStatement::fetchColumn() вы получите число совпадающих строк.

Результатом выполнения данного примера будет что-то подобное:

Смотрите также

User Contributed Notes 15 notes

When updating a Mysql table with identical values nothing’s really affected so rowCount will return 0. As Mr. Perl below noted this is not always preferred behaviour and you can change it yourself since PHP 5.3.

Just create your PDO object with
true));
?>
and rowCount() will tell you how many rows your update-query actually found/matched.

Great, while using MySQL5, the only way to get the number of rows after doing a PDO SELECT query is to either execute a separate SELECT COUNT(*) query (or to do count($stmt->fetchAll()), which seems like a ridiculous waste of overhead and programming time.

Another gripe I have about PDO is its inability to get the value of output parameters from stored procedures in some DBMSs, such as SQL Server.

I’m not so sure I’m diggin’ PDO yet.

To display information only when the query is not empty, I do something like this:

In some drivers rowCount() only works when using the prepare() with PDO::CURSOR_SCROLL
So, you can modify PDO class:

$db_server = «xxx» ;
$db_name = «xxx» ;
$db_user = «xxx» ;
$db_pass = «xxx» ;

Example:
========
$conn = new PDO(«mysql:host=127.0.0.1;dbname=db», ‘root’, ‘root’);

// use unbuffered query
$conn->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

MySQL does not seem to return anything in rowCount for a select statement, but you can easily and efficiently get the row count as follows:

$myDb = new db(‘mysql:host=myhost;dbname=mydb’, ‘login’, ‘password’ );

Then, after running your query:

So if you use one SQL request to insert several rows at a time, and some are inserted, some are just updated, you won’t get the real count..

Please note another interesting behavior with PostgreSQL.

If you try to use rowCount() after a statement has been prepared using the PDO::ATTR_CURSOR set to PDO::CURSOR_SCROLL you will always get zero (0).

That’s because PG doesn’t have any way to tell how many rows are in the cursor until it did iterate through all rows.

Please see this bug report https://bugs.php.net/bug.php?id=77855 for details.

This documentation should be updated shortly to reflect that issue.

Well, I woundn’t do as suggested querying twice the database to get the count and then get the data I want. It would be simpler and would give better performance to query once and retrieve both, record count and the data itself

As of SQLite 3.x, the SQLite API itself changed and now all queries are implemented using «statements». Because of this, there is no way for PDO to know the rowCount of a SELECT result because the SQLite API itself doesn’t offer this ability.

The actual code should be posted in the above/below post (max post limits, argh!). If others wish to extend/perfect this method, please keep me posted with an email as to what you’ve done.

Yet another workaround to return the row count inside only ONE select (see limitations below!):

Advantages:
— only one select statement is executed, no two steps needed!
— it checks if one row exists in the table or not, according to the WHERE clause.
— it returns all (or only a selection of) fields for that one row, if exists.

Uses:
— It is perfect for checking if a user/pass pair is present in a users table and to return the other fields of the user (like name, phone, whatever) if user was found.

My rowCount() workaround & how it’s used:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *