Не удалось получить элемент массива и сохранить в базе данных

avatar
vPtel
8 апреля 2018 в 07:49
60
1
0

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

$array_att_logs = $logs3->to_array(); 
    echo " <pre>"; 
    print_r($array_att_logs); 
    echo "/<pre>"; 
    
    // it shows array as follow
    
    Array
(
    [Row] => Array
        (
            [0] => Array
                (
                    [PIN] => 1274
                    [DateTime] => 2018-04-07 09:28:16
                    [Verified] => 15
                    [Status] => 3
                    [WorkCode] => 0
                )

            [1] => Array
                (
                    [PIN] => 157
                    [DateTime] => 2018-04-07 10:22:56
                    [Verified] => 15
                    [Status] => 3
                    [WorkCode] => 0
                )
    // these are the raw punch data from biometric machine

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

if(isset($array_att_logs) && $array_att_logs != NULL){
                        
   foreach ($array_att_logs as $key => $value) {
        echo "<tr>";
        echo "<td>" . $array_att_logs['PIN'] ."</td>";
        echo "<td>" . $array_att_logs['DateTime'] ."</td>";
        echo "</tr>";  

 $punch_query = "INSERT INTO punching_data_table (pin,date_time) 
                            VALUES('$PIN','$value')";
$punch_result = mysql_query($punch_query)
  }
}

Ответы с пояснениями к примеру кода будут очень признательны.

Источник
mickmackusa
8 апреля 2018 в 07:52
0

Используйте $value ['PIN'] вместо $array_att_logs['PIN']. Не используйте функции mysql_. Используйте mysqli или pdo с подготовленными операторами и заполнителями.

Ответы (1)

avatar
Namoshek
8 апреля 2018 в 08:08
0

Элемент верхнего уровня вашего массива имеет индекс Row, поэтому вам следует изменить цикл foreach на foreach ($array_att_logs['Row'] as $key => $value) { ... }.

Вторая часть — это то, на что Микмакуса уже указал в комментарии: вам нужно использовать локальную переменную $value для доступа к пин-коду и дате-времени.

Вам также не нужно проверять null после isset(...), потому что это то, что isset уже делает. Лучше проверить наличие индекса Row.

В конечном итоге вы сможете заставить его работать с помощью следующего фрагмента кода:

if(isset($array_att_logs) && isset($array_att_logs['Row'])) {                     
    foreach ($array_att_logs['Row'] as $key => $value) {
        echo "<tr>";
        echo "<td>" . $value['PIN'] ."</td>";
        echo "<td>" . $value['DateTime'] ."</td>";
        echo "</tr>";  

        $punch_query = "INSERT INTO punching_data_table (pin, date_time) VALUES ('$value['PIN']', '$value['DateTime']')";
        $punch_result = mysql_query($punch_query)
    }
}

Я также советую вам взглянуть на зарезервированные слова в MySQL (см. документацию). В столбце DateTime используется одно из этих имен, которых следует избегать. Лучше использовать более описательное имя, например CreatedAt, UpdatedAt или MeasuredAt. Также было бы неплохо перейти от старых функций mysql_ к функциям mysqli_ или PDO в качестве следующего шага (из-за проблем безопасности с mysql_, а также потому, что они устарели).

vPtel
8 апреля 2018 в 09:08
0

Спасибо, приятель ... что-то вроде табличного формата, но когда дело дошло до вставки в таблицу, возникла следующая ошибка. Ошибка синтаксического анализа: синтаксическая ошибка, неожиданное '' (T_ENCAPSED_AND_WHITESPACE), ожидание идентификатора (T_STRING), переменной (T_VARIABLE) или числа (T_NUM_STRING) в C:\xampp\htdocs\......\filename.php в строке 97 ill будьте осторожны с зарезервированными словами, хотя столбец DateTime относится к устройству, которое я не могу контролировать. В моей базе данных я определил его как date_time, с которым, я думаю, он не конфликтует. Спасибо за помощь.

Namoshek
8 апреля 2018 в 09:15
0

Можете ли вы дать мне представление о том, что написано в строке 97 в filename.php?

vPtel
8 апреля 2018 в 09:23
0

строка № 97 --> $punch_query = "ВСТАВИТЬ В Punching_data_table (pin, date_time) VALUES ('$value['PIN']', '$value['DateTime']')"; строка № 98 --> $punch_result = mysql_query($punch_query);

Namoshek
8 апреля 2018 в 09:25
0

Является ли ваш PIN-код числовым полем в базе данных? Тогда, возможно, просто удалите ' вокруг $value['PIN'] в запросе.

vPtel
8 апреля 2018 в 09:34
0

удалено ' вокруг $value['PIN'], но все равно не повезло, та же ошибка. Да, PIN-код установлен как целое число в базе данных. Если я не ошибаюсь, чтобы правильно его интерпретировать, в нем говорится, что двойная кавычка «неожиданна».

vPtel
8 апреля 2018 в 09:37
0

строка № 97 теперь выглядит как ---> $punch_query = "ВСТАВИТЬ В Punching_data_table (pin, date_time) VALUES ($value['PIN'], '$value['DateTime']')"; date_time определяется как DateTime в базе данных, только к вашему сведению.

Namoshek
8 апреля 2018 в 09:38
1

Ах да, не должно быть одинарных кавычек для доступа к массиву при прямом доступе в двойных кавычках. Попробуйте так: $punch_query = "INSERT INTO punching_data_table (pin, date_time) VALUES ($value[PIN], '$value[DateTime]')";

mickmackusa
8 апреля 2018 в 11:04
0

@vPtel Как правило, вы должны использовать одинарные кавычки для своих ключей. Заключите ваши значения в фигурные скобки. {$value['PIN']}

mickmackusa
8 апреля 2018 в 11:10
1

@Namoshek if(isset($array_att_logs) && isset($array_att_logs['Row'])) можно сократить до if (isset($array_att_logs, $array_att_logs['Row'])) с тем же значением. Или, что наиболее логично, просто вызовите if(isset($array_att_logs['Row'])) ... потому что, если ключ подмассива существует, то существует и родительский массив. Это самое прямое и без уведомления. Также не следует объявлять $key, поскольку он не используется.

mickmackusa
8 апреля 2018 в 11:13
0

@Namoshek В целях демонстрации хороших методов кодирования, пожалуйста, избегайте использования функций mysql_ в своих ответах. Это повлияет на OP и будущих исследователей, чтобы они перестали использовать старые устаревшие функции.

Namoshek
8 апреля 2018 в 11:17
0

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

vPtel
6 мая 2018 в 09:34
0

@Namoshek, извините, снова за ответ на вопрос. На самом деле, я получаю сообщение об ошибке неправильного смещения строки, когда массив [0]=> в var_dump выше, но если их больше нуля, то нет проблем. Могу ли я проверить, существует ли [1]=>массив, а затем выполнить код, в противном случае false. ( [Row] => Array ( [0] => Array ( [PIN] => 1274 [DateTime] => 2018-04-07 09:28:16 [Verified] => 15 [Status] => 3 [WorkCode ] => 0 )

Namoshek
6 мая 2018 в 10:50
0

Конечно, вы всегда можете использовать isset($array['named_index']) или count($array) > 0 для таких случаев. По этому вопросу уже есть много материалов (вопросов и ответов).

vPtel
6 мая 2018 в 11:38
0

@Namoshek, спасибо, приятель, уже попробовал это и теперь понял, что проблема не в части массива, а в операторе вставки .. извините. Недопустимая строка смещения вызывается в строке № 93, которая является оператором вставки, говорящим о недопустимой строке смещения «PIN» и «DateTime». Последний оператор Insert, как показано ниже. $punch_query = "ВСТАВИТЬ ИГНОРИРОВАТЬ В Punching_data_table (emp_code, date_time,in_out_status) VALUES ($value[PIN], '$value[DateTime]','$in_out_status')"; этот запрос отлично работает, если имеется более 1 вставки, но если существует только 1, отображается ошибка.

Namoshek
6 мая 2018 в 11:46
0

Трудно помочь здесь в комментариях с такими проблемами. Пожалуйста, разместите новый вопрос с правильно отформатированным кодом и подробным описанием проблемы.

vPtel
6 мая 2018 в 13:27
0

@Namoshek Я разместил здесь новый вопрос с правильно отформатированным кодом и подробным описанием.