2017-01-27 3 views
0

У меня есть этот PHP код, который выбирает одно простое значение:Возвращает значение по умолчанию, если записи не найдены

$name = $mysqli->query('SELECT name FROM users WHERE id = ' . $id . ' LIMIT 1')->fetch_object()->name; 

Теперь, если результат равен 0, то выдает сообщение об ошибке.

Я хочу вместо этого вернуть значение по умолчанию, например «Нет имени», если результатов нет.

Любые предложения?

+3

Как насчет 'if ($ result == null) return 'No Name''; перед вами 'fetch_object()' – pixelarbeit

+1

Сначала попробуйте проверить результат. Если результат вернет его, если не будет отправлено ваше значение по умолчанию. – chris85

+1

'SELECT IFNULL (имя, 'no name') FROM ...' – McNets

ответ

6

Не выбирайте имя напрямую, вместо этого проверьте, если в нем есть данные. Нечто подобное должно работать:

$result = $mysqli->query('SELECT name FROM users WHERE id = ' . $id . ' LIMIT 1')->fetch_object(); 

$name = (!$result) ? 'No name' : $result->name; 

Дополнительно, в качестве @RiggsFolly упоминалось, предлагается использовать подготовленные заявления, чтобы уменьшить возможности SQL:

$stmt = $mysqli->prepare("SELECT name FROM users WHERE id = ? LIMIT 1"); 
$stmt->bind_param('i',$id); 
$stmt->execute(); 
$result = $stmt->get_result()->fetch_object(); 
+2

[SQL Injection Attack] (http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) Посмотрите, что случилось с [Little Bobby Tables] (http : //bobby-tables.com/) Даже [если вы избегаете входных данных, это небезопасно!] (http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real -escape-string) Использовать [подготовленные параметризованные утверждения] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) – RiggsFolly

3

Это может быть сделано в чистом SQL, так что вы Wouldn «т нужны дополнительные строк PHP код:

$name = $mysqli->query('SELECT IFNULL((SELECT name FROM users WHERE id = ' . $id . ' LIMIT 1), "No Name") name')->fetch_object()->name; 
+2

Упрощение для решения SQL. Хотя я думаю, что это лучше сделать на уровне приложений, так как гораздо более ясно, что происходит (и это происходит от парня базы данных). – JNevill

+1

Я согласен с тобой, решение Дайниса Абола - это то, что я бы тоже сделал. Причина в том, что я не хочу, чтобы то же самое поведение для моего приложения в двух случаях, когда пользователь нашел или пользователь не нашел, в то время как в этом решении, если у меня есть пользователь с именем «Нет имени», у меня нет абсолютно никакого способа на уровне приложения, чтобы определить, есть ли я в случае, если пользователь не найден или нет. Но иногда это может быть именно то, что вы хотите: наличие приложения, которое действует точно так же в двух ситуациях. –

+1

[SQL Injection Attack] (http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) Посмотрите, что случилось с [Little Bobby Tables] (http : //bobby-tables.com/) Даже [если вы избегаете входных данных, это небезопасно!] (http: // stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string) Используйте [подготовленные параметризованные утверждения] (http://php.net/manual/en/mysqli.quickstart.prepared- statements.php) – RiggsFolly

1

Попробуйте это с подготовленным заявлением:

$result = $mysqli->prepare('SELECT name FROM users WHERE id = ? LIMIT 1'); 
$result->bind_param("i", $id); 
$result->execute(); 
$result->bind_result($col1); 
$result->fetch(); 
$name = (!$col1) ? 'No name' : $col1; 
echo $name; 
$result->close(); 
Смежные вопросы