#php #mysqli #xmlwriter
#php #mysqli #xmlwriter
Вопрос:
Это, вероятно, очень просто, но я не знаю лучшего способа сделать это. Я извлекаю данные из базы данных mysqli с помощью php для создания XML-документа. Мой приведенный ниже код работает, но все данные в поле заголовка — заглавные буквы. Мне нужен только первый символ с заглавной буквы, остальные в нижнем регистре. Я знаю, что мне нужна функция ucwords, но пока нет кости. Поле заголовка содержит более одного слова с заглавными буквами.
Мне нужны данные, отформатированные ucwords, прежде чем они попадут в область XML. Я предпочитаю делать это в php вместо обновления данных в БД. Спасибо за помощь!
<?php
// Connect to the database
global $link;
$link = mysqli_connect("localhost", "root", "pass", "database");
// Verify the connection worked
if (!$link) {
printf("Connection to database failed: %sn", mysqli_connect_error());
exit();
}
// Prepare the database query
$stmt = mysqli_prepare($link, "SELECT * FROM table");
// Run the database query
mysqli_stmt_execute($stmt);
// Bind the result columns to PHP variables
mysqli_stmt_bind_result($stmt, $Name, $Title);
// Create a new XML document in memory
$xw = new xmlWriter();
$xw->openURI('php://output');
$xw->openMemory();
$xw->startDocument('1.0');
// Start the outer data container
$xw->StartElement('rss');
$xw->WriteAttribute('version', '2.0');
// Fetch values
while (mysqli_stmt_fetch($stmt)) {
{
$xw->startElement('item');
// Write out the elements
$xw->writeElement('Name', $Name);
$xw->writeElement('Title', $Title);
$xw->endElement();
}
// End container
$xw->endElement();
// End the document
$xw->endDocument();
//header('Content-Type: text/xml');
print $xw->outputMemory(true);
// Close the database statement
mysqli_stmt_close($stmt);
// Close the database connection
mysqli_close($link);
}
?>
Комментарии:
1. извините, что звучит как новичок, но я должен поместить это после инструкции bind? имеет ли это значение? я добавил ucwords(strtolower($Title)); а затем в выводе xml мой заголовок не отображается. Это то, что меня сбивает с толку.
2. ucwords и strtolower вернут измененную строку. они не изменят исходное значение. если вы сделаете $Title = ucwords(strtolower($Title)); то с этого момента $Title будет измененной версией. я думаю, что вам нужно $xw->writeElement(‘Title’, ucwords(strtolower($Title)));
3. Бинго, спасибо, галчен! мне это не приходило в голову. Ну, вот как я учусь, большое спасибо!
Ответ №1:
Соответствующий раздел в http://php.net/manual/en/function.ucwords.php
<?php
$foo = 'hello world!';
$foo = ucwords($foo); // Hello World!
$bar = 'HELLO WORLD!';
$bar = ucwords($bar); // HELLO WORLD!
$bar = ucwords(strtolower($bar)); // Hello World!
?>
Для вашего запроса я бы заменил:
// Prepare the database query
$stmt = mysqli_prepare($link, "SELECT * FROM table");
// Run the database query
mysqli_stmt_execute($stmt);
// Bind the result columns to PHP variables
mysqli_stmt_bind_result($stmt, $Name, $Title);
С помощью:
$results = mysqli_query("SELECT * FROM table");
Затем измените цикл while на:
foreach($results as $row) {
$xw->startElement('item');
$xw->writeElement('Name', ucwords(strtolower($row['name']));
$xw->writeElement('Title', ucwords(strtolower($row['title']));
$xw->endElement();
}
Очевидно, вам нужно повозиться с этим, поскольку я не знаю вашей схемы базы данных.
Основная причина изменения содержимого mysqli заключается в том, что вам не гарантируется одинаковый порядок столбцов базы данных, если вы внесете изменения схемы в базу данных в будущем.
Удачи!
Комментарии:
1. спасибо Хафичуку, руководству, которому я следовал, но новичок, похоже, не может заставить часть XML работать позже.