2016-08-10 3 views
-1

новичок с PHP и MySQL здесь. Я просмотрел другие статьи, чтобы попытаться объединить код, который мне нужен, но изо всех сил пытаюсь получить содержимое двух массивов, вставленных в два столбца в таблице MySQL.PHP-массивы вставляются в MySQL Таблица

В таблице MySQL структурировано на три колонки следующим образом -

|-------|-------|-------| 
| id | date | value | 
|-------|-------|-------| 

идентификатор первичный ключ устанавливается с auto_increment. дата имеет дату. Значение имеет десятичный (5,2) тип данных.

У меня есть два PHP массивы $dates и $values, которые содержат следующие -

echo '<pre>'; print_r($dates); echo '</pre>'; 
Array 
(
    [0] => 2015 
    [1] => 2014 
    [2] => 2013 
    [3] => 2012 
    [4] => 2011 
    [5] => 2010 
    [6] => 2009 
    [7] => 2008 
    [8] => 2007 
    [9] => 2006 
    [10] => 2005 
    [11] => 2004 
    [12] => 2003 
    [13] => 2002 
    [14] => 2001 
    [15] => 2000 
    [16] => 1999 
    [17] => 1998 
    [18] => 1997 
    [19] => 1996 
    [20] => 1995 
    [21] => 1994 
    [22] => 1993 
    [23] => 1992 
    [24] => 1991 
    [25] => 1990 
    [26] => 1989 
    [27] => 1988 
    [28] => 1987 
) 

echo '<pre>'; print_r($values); echo '</pre>'; 
Array 
(
    [0] => 52.32 
    [1] => 98.97 
    [2] => 108.56 
    [3] => 111.63 
    [4] => 111.26 
    [5] => 79.61 
    [6] => 61.74 
    [7] => 96.94 
    [8] => 72.44 
    [9] => 65.16 
    [10] => 54.57 
    [11] => 38.26 
    [12] => 28.85 
    [13] => 24.99 
    [14] => 24.46 
    [15] => 28.66 
    [16] => 17.9 
    [17] => 12.76 
    [18] => 19.11 
    [19] => 20.64 
    [20] => 17.02 
    [21] => 15.86 
    [22] => 17.01 
    [23] => 19.32 
    [24] => 20.04 
    [25] => 23.76 
    [26] => 18.23 
    [27] => 14.91 
    [28] => 18.53 
) 

Я сериализовать данные в двух новых переменных до моего вставки запроса -

$mydates = serialize($dates); 
$myvalues = serialize($values); 

Моя вставка заявление является следующим:

$query = "INSERT INTO eia(date,value) VALUES ('$mydates','$myvalues')"; 

с некоторой ошибкой лин -

if ($conn->query($query)) { 
    $msg = ...Sucessfully Entered! 
} else { 
    $msg = ...Error Entering! 
} 
if (isset($msg)){ 
    echo $msg; 
} 
if (!$conn->query("INSERT INTO eia(date,value) VALUES ('$mydates','$myvalues')")) { 
    printf("Errormessage: %s\n", $conn->error); 
} 

Тогда, наконец, закрыть соединение -

mysqli_close($conn); 

Когда это работает я получаю «успешно вышел» сообщение, но по проверке таблицы MySQL Я просто получить две строки со следующим -

id | date | value 
1 |{null}| 0.00 
2 |{null}| 0.00 

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

id | date | value 
1 | 2015 | 52.32 
2 | 2014 | 98.97 
... 

Благодарим вас заранее.

+0

_ «Я сериализую данные на две новые переменные» _ - здесь нет абсолютно никакого смысла. И это также причина, по которой вы получаете NULL/0.00 в своей новой записи, потому что, сериализируя эти массивы, вы создаете _strings_, которые не соответствуют ни формату вашей даты, ни вашей десятичной колонки. – CBroe

+0

@CBroe благодарит за отзыв. Я вижу ошибку, которую я здесь сделал, которая создала результирующую ошибку. – CRC

ответ

1

Вам не нужно сериализовать здесь

if ($conn->query($sql)) { 
    $msg = ...Sucessfully Entered! 
} else { 
    $msg = ...Error Entering! 
} 
if (isset($msg)){ 
    echo $msg; 
} 

$sql = 'INSERT INTO eia_brent(eiaDate,eiaValue) VALUES'; 
foreach ($dates as $index => $date) { 
    $sql .= "($date, ".$values[$index]."),"; 
} 
$sql = trim($sql,','); 

if (!$conn->query($sql)) { 
    printf("Errormessage: %s\n", $conn->error); 
} 
+0

Хорошая попытка, но OP говорит, что даты - это один массив, а значения - другой массив. – e4c5

+0

@ e4c5 Yup, но оба имеют одинаковые индексы, заданные в вопросе, я выполнил итерацию $ дат и использовал значение, присутствующее в значениях $ в том же индексе, на значения $ [$ ключ]. Правильно, если что-то не так –

+0

Я понимаю, что вы имеете в виду. Был отброшен тот факт, что ключ $ часто используется (простое соглашение) при работе с ассоциативными массивами. Таким образом, ваш ответ действительно правильный, но это переменное именование (значения $ value и $, также запутывающие), это была красная селедка. – e4c5

2

Это потому, что вы работаете и тот же запрос два раза:

if ($conn->query($query)) { 

и

if (!$conn->query("INSERT INTO eia_brent(eiaDate,eiaValue) VALUES ('$mydates','$myvalues')")) { 

Вы null и 0.00, потому что вы пытаетесь вставить сериализованную информацию в одну ячейку.

Multiple запрос вставки выглядит следующим образом:

INSERT INTO eia_brent(eiaDate, eiaValues) 
VALUES ('myDate1', 'myValue1'), ('myDate2', 'myValue2'), ('myDate3', 'myValue3'), [...] 

Вы можете зациклить свой массив и создать запрос:

$query = 'INSERT INTO eia_brent(eiaDate, eiaValues) VALUES'; 
$values = []; 

foreach ($dates as $i => $date) { 
    $values[] = "('{$date}', '{$values[$i]}')"; // validate your input to database first! 
} 

$query .= implode(', ', $values); 

$conn->query($query); 
+0

Хотя вам придется преобразовать $ values ​​[$ i] в правильный формат даты при вставке или вы получите 0000-00-00 как значения –

+0

Вы должны либо использовать (DATE_FORMAT (STR_TO_DATE ({$ values ​​[$ i]}, ' % Y '),'% Y-% m-% d ')) или изменить тип столбца на int –

+0

@ Justinas. Спасибо. Я пробовал код выше, но ничего не вставил в таблицу? Я скорректировал тип данных столбца даты на int. – CRC

0

Дата Тип данных будет принимать дату в формате YYYY-MM-DD, между 1000- 01-01 и 9999-12-31. Например, 30 декабря 1973 года будет храниться как 1973-12-30.Если вы очень подробно относитесь к хранению только года, лучше использовать int datatype

+0

Спасибо. Это имеет смысл, я настроил тип данных на INT вместо типа даты. – CRC

Смежные вопросы