Sebastian Krischer Ответов: 3

Как вставить PHP-массив в базу данных MYSQL?


Привет Гарбел Брют,

Я нашел вашу статью "Простой способ преобразования данных HTML-таблицы в массив PHP", и получилось, что она прекрасно создала массив с помощью проекта, над которым я работал. Я пытаюсь ввести этот массив в свою базу данных mysql. К сожалению, без особого успеха. Мне нужен счетчик, так как html-файл может иметь больше или меньше столбцов и строк, и мне было трудно понять, как это сделать. Любой вклад, который вы могли бы мне дать, был бы очень признателен. Я приложу то, что я написал в коде до сих пор, чтобы у вас было представление о том, где я нахожусь.

Спасибо!

Что я уже пробовал:


<?php
$servername = "localhost";
$username = "user";
$password = "pass";
$database = "ticker";

// Create connection
$conn = new mysqli($servername, $username, $password, $database);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";

$table = file_get_contents("watchlist.html");
$dom = new DOMDocument;
@$dom->loadHTML($table);
$tds = $dom->getElementsByTagName("td"); 
$tags = $dom->getElementsByTagName("th");
$symbol = $tags->item(0)->nodeValue;
$vwap = $tags->item(1)->nodeValue;
$last = $tags->item(2)->nodeValue;
$trend = $tags->item(3)->nodeValue;
$bid = $tags->item(4)->nodeValue;
$ask = $tags->item(5)->nodeValue;
$volume = $tags->item(6)->nodeValue;
$markchg = $tags->item(7)->nodeValue;
$markpcnt = $tags->item(8)->nodeValue;
$shares = $tags->item(9)->nodeValue;
$marketcap = $tags->item(10)->nodeValue; 
$ttmsqz = $tags->item(11)->nodeValue;

foreach($tags as $NodeHeader) 
	{
		$aDataTableHeaderHTML[] = trim($NodeHeader->textContent);
	}
	//print_r($aDataTableHeaderHTML); die();

$i = 0;
$j = 0;
	foreach($tds as $sNodeDetail) 
	{
		$aDataTableDetailHTML[$j][] = trim($sNodeDetail->textContent);
		$i = $i + 1;
		$j = $i % count($aDataTableHeaderHTML) == 0 ? $j + 1 : $j;

 
}
print_r($aDataTableDetailHTML); die();

 //this is where your sql goes
 $query = "INSERT INTO riser (symbol, vwap, last, bid, ask, volume, markchg, markpct, shares, marketcap, ttmsqz) VALUES ('$aDataTableDetailHTML[0][0]', '$aDataTableDetailHTML[0][1]', '$aDataTableDetailHTML[0][2]', '$aDataTableDetailHTML[0][3]', '$aDataTableDetailHTML[0][4]', '$aDataTableDetailHTML[0][5]', '$aDataTableDetailHTML[0][6]', '$aDataTableDetailHTML[0][7]', '$aDataTableDetailHTML[0][8]', '$aDataTableDetailHTML[0][9]', '$aDataTableDetailHTML[0][10]', '$aDataTableDetailHTML[0][11]')";
mysql_query($query);



$conn->close();
?>

3 Ответов

Рейтинг:
2

Richard MacCutchan

Если у вас возникли проблемы со статьей CodeProject, то, пожалуйста, разместите свой вопрос на форуме в конце статьи. Только тогда автор получит уведомление о вашей проблеме.


Рейтинг:
2

Patrice T

$query = "INSERT INTO riser (symbol, vwap, last, bid, ask, volume, markchg, markpct, shares, marketcap, ttmsqz) VALUES ('$aDataTableDetailHTML[0][0]', '$aDataTableDetailHTML[0][1]', '$aDataTableDetailHTML[0][2]', '$aDataTableDetailHTML[0][3]', '$aDataTableDetailHTML[0][4]', '$aDataTableDetailHTML[0][5]', '$aDataTableDetailHTML[0][6]', '$aDataTableDetailHTML[0][7]', '$aDataTableDetailHTML[0][8]', '$aDataTableDetailHTML[0][9]', '$aDataTableDetailHTML[0][10]', '$aDataTableDetailHTML[0][11]')";

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


Рейтинг:
1

Jochen Arndt

Вы должны выполнить SQL-вставку для каждой строки. Так что просто перенесите операцию в foreach петля:

foreach ($tds as $sNodeDetail) 
{
    $row[] = trim($sNodeDetail->textContent);
    $query = "INSERT INTO riser (symbol, vwap, last, bid, ask, volume, markchg, markpct, shares, marketcap, ttmsqz) VALUES ('$row[0]', '$row[1]', '$row[2]', '$row[3]', '$row[4]', '$row[5]', '$row[6]', '$row[7]', '$row[8]', '$row[9]', '$row[10]', '$row[11]')";
    if ($conn->query($query) !== TRUE)
    {
        // Report error here
    }

    // Or better using a parametrised query
    if ($stmt = $conn->prepare("INSERT INTO riser (symbol, vwap, last, bid, ask, volume, markchg, markpct, shares, marketcap, ttmsqz) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"))
    {
        $stmt->bind_param("ssssssssssss", $row[0], $row[1], $row[2], $row[3], $row[4], $row[5], $row[6], $row[7], $row[8], $row[9], $row[10], $row[11]);
        if ($stmt->execute() == FALSE)
        {
            // Handle error here
        }
        $stmt->close();
    }
}