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.