【问题标题】:PHP retrieve data from database and show in text areaPHP从数据库中检索数据并显示在文本区域
【发布时间】:2015-07-16 23:54:59
【问题描述】:

我正在尝试在先前创建的文本区域中显示从数据库中检索到的数据。代码应该获取用户昵称和输入消息,存储在数据库中并将其检索回文本区域,类似于一个人聊天(单击“发送消息”后键入的任何内容都应存储到数据库中并检索并显示在文本区域)。我能够存储到我的数据库中,并在文本区域之外的任何地方显示检索到的数据。任何帮助表示赞赏。谢谢!

代码:

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Untitled Document</title>
</head>

<body>
<form method="post" action="postmessage.php">
<center>


    <br />
    <label for="output">Chat history</label>
    <br />
  <textarea name="output" cols="100" rows="25" id="output"></textarea>
    <br />
   <label for="nickname" maxlength="16">Nickname</label>
    <br />
    <input type="text" name="nickname" id="nickname" />
    <br />
    <label for="message" >Type your message here:</label>
    <br />
    <input name="message" type="text" id="message" size="87" /><input type="submit" value="Send Message" />
</form>

<?php 

$connection = mysql_connect('localhost', 'root', '');
mysql_select_db('messenger', $connection);

$query = mysql_query('select * from messages');
while ($entry = mysql_fetch_object($query))
{

    printf("<p>%s <br />- <em>%s</em></p>",

        htmlentities($entry->message),
        htmlentities($entry->nickname)
    ); 
}
?>


</body>
</html>

postmessage.php

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Untitled Document</title>
</head>
<?php
$nickname=$_POST['nickname'];
$message = $_POST['message'];

$nickname = mysql_real_escape_string($nickname);
$message = mysql_real_escape_string($message);

$connection = mysql_connect('localhost', 'root', '');
mysql_select_db('messenger', $connection);

if (!mysql_query(
    "insert into messages (nickname, message) VALUES ('$nickname', '$message')"
)){
    echo ("Could not process your send request");
    };

?>

<body>
</body>
</html>

更新:

<?php
session_start();
?>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Untitled Document</title>
</head>
<body>

<form method="post" action="postmessage1.php">
    <div style="text-align: center;">
    <br />
    <label for="output">Chat history</label>
    <br />
    <textarea name="output" cols="100" rows="25" id="output"><?php if(isset($_SESSION['currentChat'])){ echo $_SESSION['currentChat']; }?></textarea>
    <br />
    <label for="nickname" maxlength="16">Nickname</label>
    <br />
    <input type="text" name="nickname" id="nickname" />
    <br />
    <label for="message" >Type your message here:</label>
    <br />
    <input name="message" type="text" id="message" size="87" /><input type="submit" value="Send Message" />
    </div>
</form>
</body>
</html>

post..php:

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Untitled Document</title>
</head>

<body>
<?php
session_start();
$nickname = isset($_POST['nickname'])?$_POST['nickname']:"";
$message = isset($_POST['message'])?$_POST['message']:"";

if(empty($nickname) || empty($message)){
    // no data return to form
    header("location: chatform.php");
}

$mysqli = new mysqli("localhost", "root", "", "messenger");
/* create a prepared statement */
if ($stmt = $mysqli->prepare("INSERT INTO messages (nickname, message) VALUES (?, ?)")) {
    /* bind parameters for markers */
    $stmt->bind_param("ss", $nickname, $message);
    /* execute query */
    $stmt->execute();
    /* close statement */
    $stmt->close();
}
/* close connection */
$mysqli->close();

// Update Session
$_SESSION['nickname'] .= htmlentities($nickname);
$_SESSION['currentChat'] .= htmlentities($message);

// Redirect back to display content
header("Location: chatform.php");
?>
</body>
</html>

【问题讨论】:

  • 你能把代码贴在你想在 textarea 中显示的地方吗?
  • 欢迎来到 Stack Overflow。你会因为使用 MySQL 而受到攻击。它已被弃用,不应使用,建议使用 MySQLi 或 PDO。
  • 你的文本区域在哪里,最后我看到它看起来像这样&lt;textarea name="textarea"&gt;&lt;/textarea&gt;

标签: php


【解决方案1】:

对于您的表格,我建议如下:

<?php
session_start();
?>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Untitled Document</title>
</head>
<body>
<form method="post" action="postmessage.php">
    <div style="text-align: center;">
    <br />
    <label for="output">Chat history</label>
    <br />
    <textarea name="output" cols="100" rows="25" id="output"><?php if(isset($_SESSION['currentChat'])){ echo $_SESSION['currentChat']; }</textarea>
    <br />
    <label for="nickname" maxlength="16">Nickname</label>
    <br />
    <input type="text" name="nickname" id="nickname" value="<?php echo $_SESSION['nickName']; ?>" />
    <br />
    <label for="message" >Type your message here:</label>
    <br />
    <input name="message" type="text" id="message" size="87" /><input type="submit" value="Send Message" />
    </div>
</form>
</body>
</html>

然后在您的 Post 处理程序中,执行以下操作:

<?php
start_session();
$nickname = isset($_POST['nickname'])?$_POST['nickname']:"";
$message = isset($_POST['message'])?$_POST['message']:"";

if(empty($nickname) || empty($message)){
    // no data return to form
    header("location: chatform.php");
}

$mysqli = new mysqli("localhost", "root", "", "messenger");
/* create a prepared statement */
if ($stmt = $mysqli->prepare("INSERT INTO messages (nickname, message) VALUES (?, ?)")) {
    /* bind parameters for markers */
    $stmt->bind_param("ss", $nickname, message);
    /* execute query */
    $stmt->execute();
    /* close statement */
    $stmt->close();
}
/* close connection */
$mysqli->close();

// Update Session
$_SESSION['nickName'] = htmlentities($nickname);
$_SESSION['currentChat'] .= htmlentities($message);

// Redirect back to display content
header("Location: chatform.php");
?>

更进一步,您可以通过 JS 添加时间戳,并且可以使用 AJAX 发布数据而不是使用表单。只需删除重定向和会话数据。此外,如果用户意外关闭浏览器并返回,如果会话仍然存在,它应该重新填充数据。

还可以编译聊天并每隔一分钟左右将其自动保存到数据库中,而不是每次聊天操作。添加离开按钮可以终止会话并将当时的所有内容保存到数据库中。有很多方法可以做到。

以上代码未经测试。

在 cmets 之后编辑

对于您的聊天页面,我建议将textarea 更改为div 以获得更好的样式控制。以下是样式示例:http://jsfiddle.net/Twisty/8frqcyyk/

<?php
session_start();
?>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Untitled Document</title>
<style>
.chatForm {
    background: #ccc;
    border: 1px solid #000;
    width: 40em;
}

.chatForm ul {
    padding: 0;
    width: 30em;
    margin: 5px auto;
}

.chatForm ul li {
    list-style: none;
}

.chatForm ul li label {
    display: block;
    font: 1em Verdana, sans-serif;
}

.chatForm label.title {
    background: #222;
    border: 3px solid #222;
    color: #FFF;
    display: block;
    font: 1em Verdana, sans-serif;
    height: 1.5em;
    margin: 0px auto;
    width: 30em;
}

.center {
    text-align: center;
}

.chatHistory {
    background: #fff;
    border: 1px inset #DDD;
    display: block;
    font: 1em Verdana, sans-serif;
    height: 15em;
    margin: 0px auto;
    overflow-y: scroll;
    padding: 2px;
    text-align: left;
    width: 30em;
}

.chatHistory p {
    margin: 5px 0;
}

.chatHistory label {
    display: inline-block;
    font: bold 0.85em Arial, sans-serif;
    width: 100px;
}

.chatHistory label.senderName {
    color: blue;
}

.chatHistory label.nickName {
    color: red;
}

.messageText {
    width: 75%;
}

input[type='submit'] {
    font: .85em Arial, sans-serif;
    width: 20%;

}
</style>
</head>
<body>
<form method="post" action="postmessage.php">
 <div class="chatForm">
    <label for="output" class="center title">Chat History</label>
     <div id="output" class="chatHistory">
     <?php echo $_SESSION['currentChat']; ?>
     </div>
     <ul>
         <li>
             <label for="nickname">Nickname</label>
    <input type="text" name="nickname" id="nickname" value="<?php echo $_SESSION['nickName']; ?>" />
         </li>
         <li>
             <label for="message">Type your message here:</label>
             <input name="message" type="text" id="message" class="messageText" /><input type="submit" value="Send" /></li>
     </ul>
    </div>
</form>
</body>
</html>

您的 Post 处理程序也有一些更改(不应包含在 HTML 中):

<?php
session_start();
$nickname = isset($_POST['nickname'])?$_POST['nickname']:"";
$message = isset($_POST['message'])?$_POST['message']:"";

if(empty($nickname) || empty($message)){
    // no data return to form
    header("location: chatform.php");
}

$mysqli = new mysqli("localhost", "root", "", "messenger");
/* create a prepared statement */
if ($stmt = $mysqli->prepare("INSERT INTO messages (nickname, message) VALUES (?, ?)")) {
    /* bind parameters for markers */
    $stmt->bind_param("ss", $nickname, $message);
    /* execute query */
    $stmt->execute();
    /* close statement */
    $stmt->close();
}

// Update Session
$_SESSION['nickname'] .= htmlentities($nickname);
$results = $mysqli->query("SELECT * FROM messages");
$updateChat = "";
while($row = $results->fetch_assoc()){
    $updateChat .= "<p><label>". htmlentities($row['nickname'] .":</label>";
    $updateChat .= htmlentities($row['message']) . "</p>\r\n";
}
$results->free();
$mysqli->close();
$_SESSION['currentChat'] = $updateChat;
// Redirect back to display content
header("Location: chatform.php");
?>

如果是我,我会改进我的数据库架构。该表可以包含更多列:ID, DateStamp, Sender, Recipient, Message。希望对您有所帮助,并且再次未经测试。

【讨论】:

  • 非常感谢。我修复了您代码中的一些拼写错误和内容(检查上面的更新代码),现在我可以在文本区域中获取消息,但是消息不会在另一个下方出现,并且昵称(发送消息的人)丢失了。我尝试在文本区域添加另一个回声,但所有昵称都出现在消息的末尾。之前您有指向昵称文本输入的昵称,现在已删除(应该转到文本区域)。我注意到的另一件事是,如果我从数据库中删除一些消息并在浏览器中刷新“聊天表单”,旧消息仍然会显示,尽管我的数据库中不存在。
  • 因此文本字段和文本区域元素是原始文本。如果要换行,则需要在末尾附加一个新行:. "\r\n";。如果这是我,我会使用 DIV 并用特定的类代码包装你的内容,这样我就可以通过 CSS 控制它们。删除问题意味着您希望在重定向回来之前使用来自数据库的查询重新填充会话数据。我将添加一个编辑来说明我的意思。
  • 太棒了。我可能写得很快。如果对您有所帮助,希望您能将其标记为答案。
猜你喜欢
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 2017-07-31
相关资源
最近更新 更多