подготовить stmt, считать строки, извлекать массив

0

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

Если нет уникальных идентификаторов с сегодняшней датой, я вставляю сегодня дату как первый идентификатор дня. Если есть идентификаторы, содержащие сегодняшнюю дату, я увеличиваю этот идентификатор на 1 и INSERT, чтобы ID в базу данных.

Это довольно просто. Единственная проблема, с которой я столкнулся, - это выборка массива строк, содержащих сегодняшнюю дату.

//use today date for ID
  $idDate = date(Ymd);

  $param = "{$idDate}%";

  //retrieve all rows with today date in ID
  $find = $mysqli->prepare("SELECT * FROM users WHERE userid LIKE ? ");
  $find->bind_param("s", $param);
  $findresult = $find->execute();
    if(!$findresult){
     die('Invalid query : ' . mysqli_error($mysqli));
      }

  $find->store_result();

Запрос num_rows что-то, потому что num_rows подсчитывает как минимум 1 строку, а mysqli_error не дает мне никаких ошибок для этого конкретного запроса.

  //count the rows
  $idcount = $find->num_rows();

  //if no rows contain today date in IDs
  if($idcount == 0){
    $userid = $idDate . '00';
    }
    else{

Это дает мне ошибку: mysqli_fetch_array() ожидает, что параметр 1 будет mysqli_result, данный объект

      //store today IDs in array
      while($found = mysqli_fetch_array($find)){
        $todaysids[] = array($found['userid']);
        }


        //find highest value 
        $hival = max($todaysids);
        //add 1 to highest value
        $userid = $hival++;
        }

Как получить результат запроса и получить массив?

Теги:
arrays
mysqli
fetch
prepared-statement

2 ответа

1

Вы смешиваете OO и процедурные стили в своем коде. Вы можете использовать get_result и придерживаться стиля OO:

$findresult = $find->execute();
$result = $find->get_result();
while ($found = $result->fetch_array(MYSQLI_ASSOC))
...
  • 0
    одно замечание: эта функция может быть недоступна, если драйвер mysql не является mysqlnd . следует использовать другой способ - $find->bind_result($col1, etc..) . и опечатка, должно быть $find->get_result() кстати.
  • 0
    я не должен использовать store_result() если я использую get_result() ?
Показать ещё 2 комментария
0

Вы можете использовать строки count в своем запросе так, как это.

   $find = $mysqli->prepare("SELECT col1,col2,col3,col4 , count(*) as counts FROM users WHERE userid LIKE ? ");
                                                          ^^^^^^^^^^^^^^^^^--// for counting rows
   $find->bind_param("s", $param);
   $find->execute();
   $find->store_result();
   $find->bind_result( $col1 , $col2,$col3,$col4,$counts);  // bind your variables here
   $find->fetch() ;

   echo $counts ; // will give you number rows here.
   echo $col1 ;

редактировать:

    while($row = $find->fetch() ;)
    {
     echo $counts ; // will give you number rows here.
     echo $col1 ;
    }
  • 0
    Когда вы используете bind_result() , значения возвращаются как массивы?
  • 0
    @JosanIracheta это зависит от того, как вы их получаете. если у вас есть массив значений, вы можете использовать цикл while. смотри мое редактирование
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню