PHP PDO возвращает одну строку


113

ОБНОВЛЕНИЕ 2:

Так это максимально оптимизированный вариант?

$DBH = new PDO( "connection string goes here" );

$STH = $DBH -> prepare( "select figure from table1" );

$STH -> execute();

$result = $STH -> fetch();

echo $result ["figure"];

$DBH = null;

ОБНОВЛЕНИЕ 1:

Я знаю, что могу добавить ограничение на sql-запрос, но я также хочу избавиться от цикла foreach, который мне не нужен.

ОРИГИНАЛЬНЫЙ ВОПРОС:

У меня есть следующий сценарий, который является хорошим ИМО для возврата множества строк из базы данных из-за раздела «foreach».

Как мне это оптимизировать, если я знаю, что всегда буду получать только 1 строку из базы данных. Если я знаю, что когда-либо получу только одну строку из базы данных, я не понимаю, зачем мне нужен цикл foreach, но я не знаю, как изменить код.

$DBH = new PDO( "connection string goes here" );

$STH = $DBH -> prepare( "select figure from table1" );

$STH -> execute();

$result = $STH -> fetchAll();

foreach( $result as $row ) {
    echo $row["figure"];
}

$DBH = null;

2
$STH - $DBH -> prepare должно быть $STH = $DBH -> prepareнесколько мест на этой странице.
— Rune

Вы можете использовать foreach в перерыве;
— EgoistDeveloper

Ответы:


206

Просто принеси. получает только одну строку. Таким образом, цикл foreach не требуется: D

$row  = $STH -> fetch();

пример (ты норткилдонан):

$dbh = new PDO(" --- connection string --- "); 
$stmt = $dbh->prepare("SELECT name FROM mytable WHERE id=4 LIMIT 1"); 
$stmt->execute(); 
$row = $stmt->fetch();

12
Наиболее оптимально, если вы используете «LIMIT 1» в своем операторе подготовки.
— mjspier

2
великолепно, дайте, пожалуйста, полный пример. Не просто одна строка, которая должна идти куда-то в приведенном выше примере.
— andrebruton

3
@andrebruton $dbh = new PDO(" --- connection string --- "); $stmt = $dbh->prepare("SELECT name FROM mytable WHERE id=4 LIMIT 1"); $stmt->execute(); $row = $stmt->fetch();
— low_rents

2
fetch(PDO::FETCH_ASSOC)разрежет возвращаемый массив пополам, если вам нужен только массив значений ключа.
— rybo111

Неужели вам действительно нужно LIMIT 1все время? На UNIQUEум приходит осознание того, что вы выбираете ценность.
— Super Cat

15
$DBH = new PDO( "connection string goes here" );
$STH - $DBH -> prepare( "select figure from table1 ORDER BY x LIMIT 1" );

$STH -> execute();
$result = $STH -> fetch();
echo $result ["figure"];

$DBH = null;

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

Вы можете сделать больше оптимизации, установив тип выборки, см. Http://www.php.net/manual/de/pdostatement.fetch.php . Если вы обращаетесь к нему только через имена столбцов, вам нужен нумерованный массив.

Помните о предложении ORDER. Используйте ORDER или WHERE, чтобы получить нужную строку. В противном случае вы всегда будете получать первую строку в таблице.


13

Ты пробовал:

$DBH = new PDO( "connection string goes here" );
$row = $DBH->query( "select figure from table1" )->fetch();
echo $row["figure"];
$DBH = null;

4
Вы могли пойти дальше и сделать $row = $DBH->query($query)->fetch()['figure']. Если fetchвозвращается falseиз-за отсутствия результатов, PHP будет игнорировать неверную ссылку на ключ. Если что-то пойдет не так query, в зависимости от того, как вы настроили обработку ошибок, оно либо вызовет исключение (желаемое, на мой взгляд), либо вы получите Invalid object method reference "fetch" on "false"....ошибку, форму которой вы бы в любом случае получили, потому что запрос явно не удался.
— Kael 01


8

Вы можете попробовать это для запроса SELECT базы данных на основе пользовательского ввода с использованием PDO:

$param = $_GET['username'];

$query=$dbh->prepare("SELECT secret FROM users WHERE username=:param");
$query->bindParam(':param', $param);
$query->execute();

$result = $query -> fetch();

print_r($result);

3
Я думаю, у тебя просто плохой день, братан, или ты просто хочешь выделиться из своего профиля. Мой ответ подтверждается тем же сценарием с использованием переменной для функции SELECT с запросом PDO. Я удалю комментарий sql-инъекции из своего ответа, чтобы сделать ваш день (и мой).
— user3162468

4

как насчет использования limit 0,1для оптимизации mysql

и о вашем коде:

$DBH = new PDO( "connection string goes here" );

$STH - $DBH -> prepare( "select figure from table1" );

$STH -> execute();

$result = $STH ->fetch(PDO::FETCH_ASSOC)

echo $result["figure"];

$DBH = null;

3

Благодаря предложению Стивена использовать fetchColumn, вот моя рекомендация сократить одну строку из вашего кода.

$DBH = new PDO( "connection string goes here" );
$STH = $DBH->query( "select figure from table1" );
$result = $STH->fetchColumn();
echo $result;
$DBH = null;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.