#php #mysql
#php #mysql
Вопрос:
Я работаю вместе с некоторым руководством о том, как импортировать данные Excel в mysql. Проблема, с которой я столкнулся, заключается в том, что они использовали PEAR: для подключения к базе данных, и я не знаю, как это работает. Поэтому я хотел бы преобразовать код в обычно используемую строку подключения mysql. Я уверен, что никогда не видел, чтобы PEAR или DB::connect использовались раньше.
Вот код ниже.
<?php
require_once( "db.php" );
$data = array();
$db =amp; DB::connect("mysql://root@localhost/names", array());
if (PEAR::isError($db)) { die($db->getMessage()); }
function add_person( $first, $middle, $last, $email )
{
global $data, $db;
$sth = $db->prepare( "INSERT INTO names VALUES( 0, ?, ?, ?, ? )" );
$db->execute( $sth, array( $first, $middle, $last, $email ) );
$data []= array(
'first' => $first,
'middle' => $middle,
'last' => $last,
'email' => $email
);
}
if ( $_FILES['file']['tmp_name'] )
{
$dom = DOMDocument::load( $_FILES['file']['tmp_name'] );
$rows = $dom->getElementsByTagName( 'Row' );
$first_row = true;
foreach ($rows as $row)
{
if ( !$first_row )
{
$first = "";
$middle = "";
$last = "";
$email = "";
$index = 1;
$cells = $row->getElementsByTagName( 'Cell' );
foreach( $cells as $cell )
{
$ind = $cell->getAttribute( 'Index' );
if ( $ind != null ) $index = $ind;
if ( $index == 1 ) $first = $cell->nodeValue;
if ( $index == 2 ) $middle = $cell->nodeValue;
if ( $index == 3 ) $last = $cell->nodeValue;
if ( $index == 4 ) $email = $cell->nodeValue;
$index = 1;
}
add_person( $first, $middle, $last, $email );
}
$first_row = false;
}
}
?>
<html>
<body>
These records have been added to the database:
<table>
<tr>
<th>First</th>
<th>Middle</th>
<th>Last</th>
<th>Email</th>
</tr>
<?php foreach( $data as $row ) { ?>
<tr>
<td><?php echo( $row['first'] ); ?></td><
<td><?php echo( $row['middle'] ); ?></td><
<td><?php echo( $row['last'] ); ?></td><
<td><?php echo( $row['email'] ); ?></td><
</tr>
<?php } ?>
</table>
Click <a href="list.php">here</a> for the entire table.
</body>
</html>
Комментарии:
1. Но вы знаете «часто используемый» метод подключения? Единственное, что вам нужно сделать, это установить соединение с вашим любимым методом, а затем изменить
add_person
функцию для выполнения вставки?2. Голосование за закрытие за то, что он дал мне код .
Ответ №1:
Я предполагаю, что из вашего сообщения вам также нужны mysql_*
функции, а не более новый MySQLi
класс. (Лично я предпочитаю последнее, так как мне нравится OO-интерфейс.)
Затем измените
$db =amp; DB::connect("mysql://root@localhost/names", array());
if (PEAR::isError($db)) { die($db->getMessage()); }
Для
$db = @mysql_connect('localhost', 'user', 'pass') or die ( mysql_error() );
mysql_select_db('db_name', $db);
И измените
$sth = $db->prepare( "INSERT INTO names VALUES( 0, ?, ?, ?, ? )" );
$db->execute( $sth, array( $first, $middle, $last, $email ) );
Для
$query = sprintf(
'INSERT INTO names VALUES( 0, "%s", "%s", "%s", "%s" )' ,
mysql_real_escape_string($first),
mysql_real_escape_string($middle),
mysql_real_escape_string($last),
mysql_real_escape_string($email)
);
mysql_query($query, $db);
Комментарии:
1. Спасибо за это, это очень помогло — мне даже не пришлось ничего менять. Я просто скопировал и вставил ваш код.
Ответ №2:
PEAR DB — это устаревший уровень абстракции базы данных. Это довольно просто в использовании (на самом деле, я думаю, что это чище, чем собственные функции mysql).
$db =amp; DB::connect("mysql://root@localhost/names", array());
if (PEAR::isError($db)) { die($db->getMessage()); }
было бы
$db = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname)) or die("The site database appears to be down.");
Далее,
$sth = $db->prepare( "INSERT INTO names VALUES( 0, ?, ?, ?, ? )" );
$db->execute( $sth, array( $first, $middle, $last, $email ) );
было бы:
$res = mysqli_query($db,"INSERT INTO names VALUES ($first, $middle, $last, $email)");
Это очень упрощенный (и потенциально опасный) пример. Обратите внимание, что вы теряете встроенные средства защиты, предлагаемые PEAR DB (подготовленные инструкции). Вы можете изменить приведенное выше утверждение, используя собственные функции MySQL следующим образом:
$res = mysqli_prepare($db, "INSERT INTO names VALUES( 0, ?, ?, ?, ? )")
mysqli_stmt_bind_param($res, 'ssss', $first, $middle, $last, $email);
mysqli_stmt_execute($res);
mysqli_stmt_close($res); // CLOSE $res
Преимущество использования второго примера заключается в том, что mysql гарантирует, что четыре поля являются строками (четыре s в функции bind_param). Хороший способ убедиться, что ваши конечные пользователи не вставляют неправильный тип данных для поля.
Остальная часть вашего примера просто считывает значения из XLS.
Комментарии:
1. MDB2 по большей части можно вставить прямо на место DB, хотя некоторые функции не являются напрямую эквивалентными / доступными.
2. Точно. Хорошее руководство по переходу с DB на MDB2 находится здесь: phpied.com/db-2-mdb2