如何使用 php 在 mysql 中存储多语言文本字段? [英] How store multiple language textfield in mysql with php?
问题描述
我正在尝试按语言保存多个文本字段,并且在保存时如果有任何语言的空文本字段,请忽略它,但由于某些错误,我的代码无法正常工作,当我单击提交时仅保存第一个文本字段>
数据库
+----------+------------+---------------+|email_id |email_lang |电子邮件内容|+------------+------------+--------------+||||+------------+------------+--------------+
HTML
PHP
prepare(INSERT INTO emailtemplates (email_id,email_lang,email_content) VALUES (:email_id, :email_lang, :email_content)");$email_id = $_POST['email_id'];$email_lang = $_POST['email_lang'];$email_content = $_POST['email_content'];$句子->执行(数组(':email_id' =>$email_id,':email_lang' =>$email_lang,':email_content' =>$email_content));}$languages = ['en', 'fr', 'ru'];需要'../views/new.email.view.php';?>
预期结果
+----------+------------+---------+|email_id |email_lang |电子邮件内容|+------------+------------+-----------------+|1 |zh |英文内容||1 |fr |法语内容|+------------+------------+-----------------+
HTML 部分
HTML 表单中的输入字段需要具有名称,以便您识别语言.在 HTML 中,您可以使用方括号创建字段名称.当 PHP 收到这些值时,它会将它们视为一个数组.您可以像这样定义 :
然后在 PHP 中,您可以使用以下语法访问该值:
$french = $_POST['email_content']['fr'];
注意事项:
- HTML
没有
type
和value
属性. - 无需向
元素添加
hidden
属性,只需指定type=hidden"
. - 在 HTML 中输出任何动态内容时,您应该注意XSS 保护.
- 您可以使用更短的语法
<?=$var ?>
而不是
<?php echo $var ?>
您的完整 HTML 表单可能如下所示:
在 PHP 中收到表单后,您的 $_POST
应该包含如下内容:
数组 ('email_id' =>'12','email_content' =>大批 ('en' =>'','fr' =>'法语文本','ru' =>'',),'保存' =>'',)
PHP 部分
要使用 PDO 在 PHP 中保存多个值,您需要使用循环.在循环之前,您应该准备语句并绑定参数.PDO_stmt::bind_param()
很少使用,但在这种情况下它可以使您的代码更简洁.您还应该在事务内执行所有插入操作.
$pdo->beginTransaction();$stmt = $pdo->prepare("INSERT INTO emailtemplates (email_id,email_lang,email_content)VALUES (:email_id, :email_lang, :email_content)");$stmt->bindParam('email_id', $_POST['email_id']);$stmt->bindParam('email_lang', $lang);$stmt->bindParam('email_content', $contents);foreach ($_POST['email_content'] as $lang => $contents) {if ($contents && in_array($lang, $languages, true)) {$stmt->execute();}}$pdo->commit();
如果您希望使用更简单的语法,您可以使用 PDO_stmt::execute()
无需事先绑定即可传递参数.
$pdo->beginTransaction();$stmt = $pdo->prepare("INSERT INTO emailtemplates (email_id,email_lang,email_content)VALUES (:email_id, :email_lang, :email_content)");foreach ($_POST['email_content'] as $lang => $contents) {if ($contents && in_array($lang, $languages, true)) {$stmt->执行(['email_id' =>$_POST['email_id'],'email_lang' =>$lang,'email_content' =>$内容,]);}}$pdo->commit();
以下行检查是否提供了内容以及语言是否在您指定的语言数组中.
if ($contents && in_array($lang, $languages, true)) {
I am trying to save multiple textfield by language, and when saving if there is an empty textfield of any language, ignore it but for some error my code does not work correctly and when i click submit only save the first textfield
Database
+----------+------------+---------------+
| email_id | email_lang | email_content |
+----------+------------+---------------+
| | | |
+----------+------------+---------------+
Html
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post">
<input type="text" value="<?php echo $_GET['id']; ?>" name="email_id" hidden>
<?php foreach ($languages as $lang): ?>
<input type="text" value="<?php echo $lang ?>" name="email_lang">
<textarea type="text" value="1" name="email_content"></textarea>
<?php endforeach ?>
<button type="submit" name="save">Save</button>
</form>
Php
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST'){
$sentence = $connect->prepare("INSERT INTO emailtemplates (email_id,email_lang,email_content) VALUES (:email_id, :email_lang, :email_content)");
$email_id = $_POST['email_id'];
$email_lang = $_POST['email_lang'];
$email_content = $_POST['email_content'];
$sentence->execute(array(
':email_id' => $email_id,
':email_lang' => $email_lang,
':email_content' => $email_content
));
}
$languages = ['en', 'fr', 'ru'];
require '../views/new.email.view.php';
?>
Expected results
+----------+------------+-----------------+
| email_id | email_lang | email_content |
+----------+------------+-----------------+
| 1 | en | english content |
| 1 | fr | french content |
+----------+------------+-----------------+
HTML part
Your input fields in the HTML form need to have names which will allow you to identify the language. In HTML you can create field names with square brackets. When PHP receives these values it will treat them as an array. You can define a <textarea>
like this:
<textarea name="email_content[fr]">
Then in PHP you can access the value using the following syntax:
$french = $_POST['email_content']['fr'];
Notes:
- HTML
<textarea>
doesn't havetype
norvalue
attributes. - Instead of adding
hidden
attribute to the<input>
elements, just specify thetype="hidden"
. - When outputting any dynamic content within HTML you should take care of XSS protection.
- Instead of
<?php echo $var ?>
you can use the shorter syntax<?=$var ?>
Your complete HTML form might then look something like this:
<form action="<?=htmlspecialchars($_SERVER['PHP_SELF'])?>" method="post">
<input type="hidden" value="<?=$id?>" name="email_id">
<?php foreach ($languages as $lang) : ?>
<textarea value="1" name="email_content[<?=htmlspecialchars($lang)?>]" placeholder="<?=htmlspecialchars($lang)?>" value="<?=htmlspecialchars($lang)?>"></textarea>
<?php endforeach ?>
<button type="submit" name="save">Save</button>
</form>
Once the form is received in PHP your $_POST
should contain something like this:
array (
'email_id' => '12',
'email_content' =>
array (
'en' => '',
'fr' => 'French text',
'ru' => '',
),
'save' => '',
)
PHP part
To save multiple values in PHP using PDO you need to use a loop. Before the loop, you should prepare the statement and bind parameters. PDO_stmt::bind_param()
is rarely used, but in this situation it can make your code cleaner. You should also perform all inserts inside of a transaction.
$pdo->beginTransaction();
$stmt = $pdo->prepare("INSERT INTO emailtemplates (email_id,email_lang,email_content)
VALUES (:email_id, :email_lang, :email_content)");
$stmt->bindParam('email_id', $_POST['email_id']);
$stmt->bindParam('email_lang', $lang);
$stmt->bindParam('email_content', $contents);
foreach ($_POST['email_content'] as $lang => $contents) {
if ($contents && in_array($lang, $languages, true)) {
$stmt->execute();
}
}
$pdo->commit();
If you wish to use the simpler syntax you can use PDO_stmt::execute()
to pass the parameters without prior binding.
$pdo->beginTransaction();
$stmt = $pdo->prepare("INSERT INTO emailtemplates (email_id,email_lang,email_content)
VALUES (:email_id, :email_lang, :email_content)");
foreach ($_POST['email_content'] as $lang => $contents) {
if ($contents && in_array($lang, $languages, true)) {
$stmt->execute([
'email_id' => $_POST['email_id'],
'email_lang' => $lang,
'email_content' => $contents,
]);
}
}
$pdo->commit();
The following line checks if contents were provided and language is in the array of languages you specified.
if ($contents && in_array($lang, $languages, true)) {
这篇关于如何使用 php 在 mysql 中存储多语言文本字段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!