Хорошо, я пытаюсь прочитать файл csv, который загружает пользователь. Он будет иметь один столбец и много строк. Каждая строка будет содержать URL-адрес. Я загрузил его и отсортировал данные, но не могу понять, как правильно извлечь эти данные и сохранить их в базе данных.
РЕДАКТИРОВАТЬ
Когда я делаю var_dump($csv)
я получаю следующее:
array (size=5)
0 =>
array (size=1)
0 => string 'http://example.com' (length=18)
1 =>
array (size=1)
0 => string 'http://example2.com' (length=19)
2 =>
array (size=1)
0 => string 'http://example3.com' (length=19)
3 =>
array (size=1)
0 => string 'http://example4.com' (length=19)
4 => boolean false
Как сохранить каждый из этих URL в качестве новой записи в таблице?
EDIT # 2
При использовании этого кода:
foreach($csv as $v) {
if($con->query("INSERT INTO table_name (url) VALUES('$v')")) {
}
else{
// connection failure
}
}
Я получаю следующую ошибку:
Примечание. Преобразование массива в строку в
Это относится к моему примеру if выше. Я получаю 4 уведомления (которые он должен хранить 4 записи с файлом, с которым я работаю, чтобы это имело смысл)
Он также сохраняет 5 записей в базе данных. Первые 4 имеют "Array" в столбце url, а последний - полностью пустой.
Используя mysqli
, сначала создайте безопасную страницу, например:
connect.php
<?php // change the Strings in quotes below
function db(){
return new mysqli('host', 'username', 'password', 'database');
}
?>
othepage.php
<?php
include 'connect.php'; $db = db(); $csv = readCSV($csvFile);
foreach($csv as $a){
foreach($a as $v){
if($db->query("INSERT 'url_table_name' ('url_column_name') VALUES('$v')"){
}
else{
// connection failure
}
}
}
$db->close();
?>
Предполагая, что вы используете PDO (он похож на mysqli, но вы используете bind_param
вместо bindParam
):
$stmt = $pdo->prepare("INSERT INTO tableName (url) VALUES (:url)");
$stmt->bindParam(':url', $url);
foreach ($csv as $row) {
$url = $row[0];
$stmt->execute();
}
Я предполагаю, что id
- это поле с автоматическим приращением, поэтому его исключение из INSERT
автоматически назначит.
Если вам нужен массив без изменений, не сортируя его по массиву и сохраняя каждый элемент в базе данных в собственной строке. Лучшим решением будет:
$Array = array(
0 => array ("http://www.example.com"),
1 => array ("http://www.example2.com"),
2 => array ("http://www.example3.com")
);
echo serialize($Array);
Что будет выводить:
a: 3: {i: 0; a: 1: {i: 0; s: 22: " http://www.example.com ";} i: 1; a: 1: {i: 0; s: 23: " http://www.example2.com ";} i: 2; a: 1: {i: 0; s: 23: " http://www.example3.com ";}}
Эта строка может быть сохранена в одной строке в базе данных и получена простым запросом выбора и выполняется:
$Unser = unserialize($unserializedArray);
так работает:
$Array = array(
0 => array ("http://www.example.com"),
1 => array ("http://www.example2.com"),
2 => array ("http://www.example3.com")
);
$Ser = serialize($Array);
print_r(unserialize($Ser));
выведет:
Массив ([0] => Массив ([0] => http://www.example.com) [1] => Массив ([0] => http://www.example2.com) [2] => Массив ([0] => http://www.example3.com))
Используйте команду for();
и foreach();
цикл, чтобы перебрать массивы и получить данные. Затем в цикле запросите базу данных.
<?php
$arr = [
0 => [
0 => "http://example.com"
],
1 => [
0 => "http://example2.com"
]
];
for ($i = 0; $i < count($arr); $i++) {
foreach ($arr[$i] as $key => $value) {
echo $key . " => " . $value . "<br>";
}
}
?>
Вывод
0 => http://example.com 0 => http://example2.com
foreach
?