Как получить одно значение из запроса MySQL в PHP
Я знаю, что этот пост похож на многие другие вопросы. Однако они совершенно не помогли разобраться в этом вопросе. Я хочу, чтобы запрос возвращал одно значение и сохранял его в переменной. SQL-запрос работает отлично в базе данных, но не с PHP. Где я здесь ошибся?
$datelink = $_GET['bdate']; $nid = $mysqli->query("select 'newsletterId' from 'newsletter' where ndate='$datelink'")->fetch_object()->name;
@Mario, я сделал это, но не сработало .. $ nid = $ mysqli-> query («выберите newsletterId из newsletter где ndate = ’30 -01-2015 ‘») -> fetch_object () -> newsletterId;
Ваш код открыт для атак с использованием SQL-инъекций. Пожалуйста, прочитайте это: stackoverflow.com/questions/60174/…
@Nephil: если ndate — это столбец DATE (так и должно быть, поскольку вы используете его для хранения дат), вам нужно использовать формат даты yyyy-mm-dd , например 2015-01-30 . Вы не получите результаты при использовании других форматов.
Типы строк @Nephil не подходят для дат. В какой-то момент вы захотите выбрать из диапазона дат, что совершенно невозможно при использовании строкового типа. Также обратите внимание, что при сортировке строк 10-02-2015 предшествует 30-01-2015 . И 01-12-2016 наступает до 10-02-2015 .
3 ответа
Первоначально я думал, что есть простой способ получить одно значение, но не смог его найти. Поэтому для получения значения нужно использовать полный код, как показано ниже.
$sql3="select newsletterId from newsletter where ndate='$bdate' limit 1"; $result3 = $conn->query($sql3); if ($result3->num_rows > 0) < while($row3 = $result3->fetch_assoc()) < $nid=$row3['newsletterId']; //Here is where the single value is stored. >> else
$datelink=$_GET['bdate']; $nid= $mysqli->query("SELECT 'newsletterId' FROM 'newsletter' WHERE ndate='$datelink' LIMIT 1")->fetch_object()->name;
Прежде чем запрашивать базу данных, вы должны инициировать свое соединение.
$mysqli = new mysqli("example.com", "user", "password", "database"); if ($mysqli->connect_errno) < echo "Failed to connect to MySQL: " . $mysqli->connect_error; >
Также опасно просто добавить строку из $ _GET. На ваш сайт можно атаковать с помощью SQL-инъекции. Вы определенно должны использовать PDO с подготовленными операторами. Или какую-то другую библиотеку, например, мне нравится dibi.
Обновление: вы получаете доступ к name столбца, которого не существует. Он должен бросить уведомление ( PHP Notice: Undefined property: stdClass::$name ). Если вы не видите уведомления, и вы разрабатываете локально (и вам обязательно нужно), вы можете включить его в свой файл php.ini с error_reporting = E_ALL .
Вероятно, вам нужна колонка newsletterId . Так что вообще:
$mysqli = new mysqli('example.com', 'user', 'password', 'database'); if ($mysqli->connect_errno) < echo 'Failed to connect to MySQL: ' . $mysqli->connect_error; > $dateRaw = $_GET['bdate']; // for example '22.12.2012', if this value is already in format YYYY-MM-DD, you can step next line and use it $date = date('Y-m-d', strtotime($dateRaw)); $statement = $mysqli->prepare("SELECT 'newsletterId' FROM 'newsletter' WHERE 'ndate'=? LIMIT 1"); $statement->bind_param('s', $date); // replace the question mark with properly escaped date $statement->execute(); $result = $statement->get_result(); if ($result->num_rows) < $newsletterObject = $result->fetch_object(); $newsletterId = $newsletterObject->newsletterId; // you had $newsletterObject->name here > else < echo "Newsletter with the date doesn't exist"; >$statement->close();
Кодовая польза
Полезные советы. Упрощаем виртуальную жизнь доступными средствами.
четверг, 15 июля 2010 г.
Единственное значение из mysql на php в 2 строки
Бывает нужно получить единственное значение из MySQL и огород из запроса и получения строки из результата, а потом использования значения полученного массива кажется явно лишним.
Т.е. стандартное (академическое) решение выглядит так:
$sql = mysqli_query("SELECT COUNT(*) FROM `table` WHERE `col`='value';"); // получаем данные $row = mysqli_fetch_assoc($sql); // получаем строку в массив echo $row['COUNT(*)']; // используем значение массива // неудобная переменная, нужно одно значение, а используем массив // можно присвоить значение новой переменной $count = $row['COUNT(*)']; // либо переопределить массив в переменную $row = $row['COUNT(*)']; // но это либо дополнительная переменная, // либо не логичное название переменной, // либо с самого начала нужно было использовать правильное название.
В принципе предлагаемый вариант немного удобнее для последующего использования:
$sql = mysqli_query("SELECT COUNT(*) FROM `table` WHERE `col`='value';"); // получаем данные list($count) = mysqli_fetch_array($sql); // получаем строку в массив и // первое значение сразу присваиваем переменной echo $count; // используем переменную
Single result from database using mysqli
I am trying to use mySQLi for the first time. I have done it in the case of loop. Loop results are showing but I am stuck when I try to show a single record. Here is loop code that is working.
How do I show a single record, any record, name, or email, from the first row or whatever, just a single record, how would I do that? In a single record case, consider all the above loop part removed and let’s show any single record without a loop.
Actually i want to remove the loop part and and without limit i want to get one record with query to show single record.
6 Answers 6
When just a single result is needed, then no loop should be used. Just fetch the row right away.
- In case you need to fetch the entire row into associative array:
$row = $result->fetch_row(); $value = $row[0] ?? false;
The last example will return the first column from the first returned row, or false if no row was returned. It can be also shortened to a single line,
$value = $result->fetch_row()[0] ?? false;
Below are complete examples for different use cases
Variables to be used in the query
When variables are to be used in the query, then a prepared statement must be used. For example, given we have a variable $id :
$query = "SELECT ssfullname, ssemail FROM userss WHERE = $conn->prepare($query); $stmt->bind_param("s", $id); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); // in case you need just a single value $query = "SELECT count(*) FROM userss WHERE = $conn->prepare($query); $stmt->bind_param("s", $id); $stmt->execute(); $result = $stmt->get_result(); $value = $result->fetch_row()[0] ?? false;
The detailed explanation of the above process can be found in my article. As to why you must follow it is explained in this famous question
No variables in the query
In your case, where no variables to be used in the query, you can use the query() method:
$query = "SELECT ssfullname, ssemail FROM userss ORDER BY ssid"; $result = $conn->query($query); // in case you need an array $row = $result->fetch_assoc(); // OR in case you need just a single value $value = $result->fetch_row()[0] ?? false;
By the way, although using raw API while learning is okay, consider using some database abstraction library or at least a helper function in the future:
// using a helper function $sql = "SELECT email FROM users WHERE = prepared_select($conn, $sql, [$id])->fetch_row[0] ?? false; // using a database helper class $email = $db->getCol("SELECT email FROM users WHERE [$id]);
As you can see, although a helper function can reduce the amount of code, a class’ method could encapsulate all the repetitive code inside, making you to write only meaningful parts — the query, the input parameters and the desired result format (in the form of the method’s name).
Yes that’s object oriented programming. It scares me bcoz it seems difficult. But I want to learn it badly. Please recommend a place/source where I can learn about classes and use of class and objects etc.
You need to know OOP only to write classes. While using them do not require no special knowledge, it is as easy as calling a regular function. The only difference is a little prefix $class-> before function name. The rest is the same.
Use mysqli_fetch_row() . Try this,
$query = "SELECT ssfullname, ssemail FROM userss WHERE user_id mt24">)" data-controller="se-share-sheet" data-se-share-sheet-title="Share a link to this answer" data-se-share-sheet-subtitle="" data-se-share-sheet-post-type="answer" data-se-share-sheet-social="facebook twitter devto" data-se-share-sheet-location="2" data-se-share-sheet-license-url="https%3a%2f%2fcreativecommons.org%2flicenses%2fby-sa%2f3.0%2f" data-se-share-sheet-license-name="CC BY-SA 3.0" data-s-popover-placement="bottom-start">Share)" title="">Improve this answer)">edited Feb 15, 2015 at 17:26 Funk Forty Niner74.4k15 gold badges68 silver badges141 bronze badgesanswered Jan 31, 2013 at 11:32 Edwin AlexEdwin Alex5,1084 gold badges28 silver badges50 bronze badges