Многомерный массив PHP в базу данных MySQL

#php #mysql #serialization #multidimensional-array

#php #mysql #сериализация #многомерный массив

Вопрос:

Я пытаюсь получить данные из XLS-файла и сбросить их в базу данных MySQL.

Я обнаружил php-файл, который будет принимать содержимое XLS и отображать их — в виде табличных данных — на веб-странице. Я попытался изменить этот код, чтобы вставить мои данные в БД.

Вот функция, которая выполняет эту работу — и которую я пытался изменить:

 function dumpSQL($row_numbers=false,$col_letters=false,$sheet=0) {
        $xlsData = '';
        for($row=1;$row<=$this->rowcount($sheet);$row  ) {
            $rowheight = $this->rowheight($row,$sheet);
            for($col=1;$col<=$this->colcount($sheet);$col  ) {
                if(!$this->sheets[$sheet]['cellsInfo'][$row][$col]['dontprint']) {
                    // cell value
                    //$val = $this->val($row,$col,$sheet);
                    $xlsData[$row][$col] = $this->val($row,$col,$sheet);
                }
            }
        }
        // Make a MySQL Connection
        mysql_connect("*******", "******", "*******") or die(mysql_error());
        mysql_select_db("***********") or die(mysql_error());
        $sql = "INSERT INTO BEER_LOCATIONS (LOCATION_NAME, LOCATION_STREET, LOCATION_CITY, LOCATION_STATE, LOCATION_ZIPCODE, LOCATION_PHONE, BEER_STYLE ) VALUES ($xlsData)";
        $result = mysql_query("
            $sql
        ") or die(mysql_error());
}
  

При запуске этого кода я получаю следующую ошибку:
У вас ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса

Я также попытался удалить часть, в которой он получает многомерный массив, и просто создать статическую версию:

 $xlsData[0][0] = "Hello World";
$xlsData[0][1] = "38380 - Thirteen Coins-Boren";
$xlsData[0][2] = "125 Boren Ave N";
$xlsData[0][3] = "Seattle";
$xlsData[0][4] = "WA";
$xlsData[0][5] = "98109";
$xlsData[0][6] = "2066822513";
$xlsData[0][7] = "34740 - Georgetown Keg - 1/2 Manny Pale";
$xlsData[1][0] = "Hello World";
$xlsData[1][1] = "38380 - Thirteen Coins-Boren";
$xlsData[1][2] = "125 Boren Ave N";
$xlsData[1][3] = "Seattle";
$xlsData[1][4] = "WA";
$xlsData[1][5] = "98109";
$xlsData[1][6] = "2066822513";
$xlsData[1][7] = "34740 - Georgetown Keg - 1/2 Manny Pale";
$xlsData[2][0] = "Hello World";
$xlsData[2][1] = "38380 - Thirteen Coins-Boren";
$xlsData[2][2] = "125 Boren Ave N";
$xlsData[2][3] = "Seattle";
$xlsData[2][4] = "WA";
$xlsData[2][5] = "98109";
$xlsData[2][6] = "2066822513";
$xlsData[2][7] = "WA";
$xlsData[3][0] = "Hello World";
$xlsData[3][1] = "86036 - Aafes Ft Lewis Class Vi";
$xlsData[3][2] = "Bldg 2202";
$xlsData[3][3] = "Fort Lewis";
$xlsData[3][4] = "WA";
$xlsData[3][5] = "98433";
$xlsData[3][6] = "2539644128";
$xlsData[3][7] = "42624 - Georgetown Keg - 1/4 Manny Pale";
  

В итоге я получаю ту же ошибку.

Я попытался сериализовать свои данные перед вставкой их в свою БД:

 $xlsData = serialize($xlsData);
  

Спасибо за любую помощь.

У меня возникли проблемы с реализацией mysql_real_escape_string(). Кажется, что его нужно обернуть вокруг implode (), но я получаю ошибку, когда пытаюсь это сделать.

 $sql = "INSERT INTO BEER_LOCATIONS (LOCATION_NAME, LOCATION_STREET, LOCATION_CITY, LOCATION_STATE, LOCATION_ZIPCODE, LOCATION_PHONE, BEER_STYLE ) VALUES ('" . mysql_real_escape_string(implode("', '", $row)) . "')"; 
  

Я получаю эту ошибку, когда пытаюсь это:
Количество столбцов не соответствует количеству значений в строке 1

Еще раз спасибо.

Комментарии:

1. На самом деле вы пытаетесь выполнить не сериализацию. Сериализация — это когда вы преобразуете объект / массив / и т.д. В строку, чтобы вы могли сохранить его без потери структуры. Когда вы храните массив значений в базе данных, вы на самом деле просто адаптируете их, чтобы они вписывались в структуру базы данных.

2. Спасибо за предупреждение относительно сериализации. Я удалил этот код.

3. Вы видели, работает ли мой ответ для вас еще? 🙂

Ответ №1:

Попробуйте заменить это:

 $sql = "INSERT INTO BEER_LOCATIONS (LOCATION_NAME, LOCATION_STREET, LOCATION_CITY, LOCATION_STATE, LOCATION_ZIPCODE, LOCATION_PHONE, BEER_STYLE ) VALUES ($xlsData)";
$result = mysql_query("
    $sql
") or die(mysql_error());
  

с помощью этого:

 foreach($xlsData as $row) {
    $sql = "INSERT INTO BEER_LOCATIONS (LOCATION_NAME, LOCATION_STREET, LOCATION_CITY, LOCATION_STATE, LOCATION_ZIPCODE, LOCATION_PHONE, BEER_STYLE ) VALUES ('" . implode("', '", $row) . "')";
    $result = mysql_query($sql) or die(mysql_error());
}
  

Вы должны вставлять каждую строку по одной за раз, так что это то, что выполняет цикл foreach. Кроме того, вы не можете просто поместить сам массив для значений. implode() Функция преобразует массив значений столбцов в строку.

РЕДАКТИРОВАТЬ: Также, вероятно, вам следует изменить $xlsData = ''; в начале функции на $xlsData = array(); Я на самом деле не уверен, что способ, которым вы ее использовали, является проблемой, но поскольку $ xlsData должен быть массивом, лучше установить его в пустой массив, чем в пустую строку.

Комментарии:

1. Кроме того, если в ваших данных есть какие-либо запятые, это приведет к прерыванию SQL-запроса. Не похоже, что в предоставленных вами данных есть какие-либо данные, поэтому я не хочу давать слишком сложный ответ, но вы действительно хотели бы использовать mysql_real_escape_string() для экранирования любых символов, которые могли бы стать проблемой.

Ответ №2:

Я получил ответ от другого полезного человека. Спасибо всем, кто мне помог 🙂

 implode("', '", array_map('mysql_real_escape_string', $row))