Заглавными буквами первый символ строки с помощью php. Затем выводите с помощью XmlWriter.

#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 работать позже.