Я не могу получить результат из запроса mysqli с PHP (преобразованный из mysql_result)

У меня есть функция PHP, которую я конвертирую с использованием расширения mysql в расширение mysqli.

Все идет хорошо, пока здесь. Раньше я использовал mysql_result для получения одного фрагмента данных. В mysqli нет прямого эквивалента, поэтому я попробовал следующее, но оно все еще не работает.

function getdbvalue($table,$value,$idfield,$id) {
  $qrytext = "SELECT $value FROM $table WHERE $idfield LIKE '$id'";
  $valueqry = mysqli_query($dbh,$qrytext);
  if (FALSE === $valueqry) die("Select failed: ".mysqli_error);
  $result = mysqli_fetch_row($valueqry);
  $returnvalue = $result[0];
  return $returnvalue;
}

Я проверил, что переменные передаются в функцию нормально, и функция фактически запускается. Если я верну $id, я увижу идентификационные номера.

Я не получаю ошибку для запроса.

РЕШЕНО:

Мне нужно было добавить переменную подключения к базе данных как глобальную в функцию:

Рабочий код:

function getdbvalue($table,$value,$idfield,$id) {
  global $dbh; // This was missing!
  $qrytext = "SELECT $value FROM $table WHERE $idfield LIKE '$id'";
  $valueqry = mysqli_query($dbh,$qrytext);
  if (FALSE === $valueqry) die("Select failed: ".mysqli_error);
  $result = mysqli_fetch_row($valueqry);
  $returnvalue = $result[0];
  return $returnvalue;
}

Спасибо всем за помощь. :)


person Dwev    schedule 11.04.2013    source источник
comment
Если вы измените как на = ??   -  person Hackerman    schedule 11.04.2013
comment
попробуйте var_dump из $result.   -  person christopher    schedule 11.04.2013
comment
@RobertRozas нет разницы между LIKE и =   -  person Dwev    schedule 11.04.2013
comment
Как бы хорошо вы ни переключились с mysql_ на mysqli, вы действительно должны использовать PDO, потому что это лучше   -  person Lemon Drop    schedule 11.04.2013
comment
@ChrisCooney возвращает NULL   -  person Dwev    schedule 11.04.2013
comment
@lemondrop детские шаги ... mysqli кажется ближе к mysql, поэтому портировать старые скрипты должно быть проще. Я посмотрю на PDO для следующего проекта.   -  person Dwev    schedule 11.04.2013
comment
Ох! Я только что попытался снова подключиться к БД внутри функции, и это сработало! Почему не помнит связь?   -  person Dwev    schedule 11.04.2013
comment
@Dwev рассмотрите возможность использования интерфейсов ООП для уровней абстракции вашей базы данных; вы можете сохранить состояние (подключение к базе данных) и внедрить зависимости. Кроме того, лучше поддерживать в долгосрочной перспективе. Переключиться на PDO; он поддерживает больше, чем просто MySQL (и через год или четыре его использования велика вероятность, что вас раздражает развертывание материала, и вы захотите использовать модели и sqlite/postgres)   -  person Amelia    schedule 11.04.2013
comment
@Hiroto ООП - это то, чему я должен научиться должным образом, но это еще не щелкнуло для меня. Я так привык к процедурному программированию, что для меня это сдвиг парадигмы, чтобы начать ООП. :/   -  person Dwev    schedule 11.04.2013
comment
@Dwev, если вы в целом застряли в ООП, попробуйте учебник на основе классов ruby ​​или python. Это невероятно легко, как только он щелкнет, и вы можете применить его где угодно.   -  person Amelia    schedule 11.04.2013
comment
-1, если вы решите сохранить свой небезопасный подход. Ничего личного, просто хочу предупредить всех, кто может наткнуться.   -  person Your Common Sense    schedule 11.04.2013
comment
Что ж, я получил правильный ответ на проблему, с которой столкнулся, поэтому я не уверен, что -1 справедлив. Ваши комментарии должны быть достаточно предупредительными, но я новичок, и, возможно, так это работает.   -  person Dwev    schedule 12.04.2013


Ответы (1)


Хотя автоматизация простого выбора — это хорошая идея, такая реализация крайне небезопасна, и ее никогда не следует использовать.

Заставьте его принимать SQL-запрос и параметры. Это сделает его безопасным.
А также вы должны использовать PDO вместо mysqli.

function getdbvalue() {
  global $pdo;
  $args = func_get_args();
  $sql  = array_shift($args);
  $stm  = $pdo->prepare($sql);
  $stm->execute($args);
  return $stm->fetchColumn();
}

должны использоваться следующим образом (сначала необходимо подключиться к PDO):

$name = getdbvalue("SELECT name FROM users WHERE id=?", $is);

это единственный правильный способ

person Your Common Sense    schedule 11.04.2013
comment
Обычно я бы сказал, что mysqli тоже может это сделать, но для этого требуется так много шаблонов и пуха, что PDO, честно говоря, является лучшим выбором для простоты использования (кроме того, подготовка массива намного проще) - person Amelia; 11.04.2013
comment
Несмотря на то, что я нашел ответ сам, я проверю ваш, поскольку он включает глобальную строку $pdo, которая была для меня проблемой. - person Dwev; 11.04.2013