【问题标题】:Using explode function in PHP and insert into a database using for loop在PHP中使用explode函数并使用for循环插入数据库
【发布时间】:2015-01-02 14:07:43
【问题描述】:

这是我想分三步做的事情。

1-) 从表单中获取名称。正在将名称输入到表单中,它们之间使用逗号。

2-) 从数据库中获取名称的 ID。

3-) 将这些名称插入表中。

我希望我清楚我想做什么。

这是我到目前为止所做的。 (我正在处理单个页面,此处排除了表单)

$writer_name = "Franz Kafka, Agatha Christie, George Bernard Shaw"; // I used a
//variable instead of using a form value here
$thing_id = 10;

$values_select = explode(",", $writer_name);
echo $values_select[0]; // returns Franz Kafka, our explode function worked

$who = "SELECT writer_id FROM writer_name WHERE writer_name = '$values_select[]'"; 

// I stuck here, I need to get all the writer's ID's and store it in an array 
// in order to insert below X times (depends on how many writers are entered), right? But how?

$who_result = $sqli->query($who);
$who_row = $who_result->fetch_array();
$who_finish = $who_row['writer_id']; 

$values = explode(",", $writer_name);
$control = count($values) - 1;
$new_values = $sqli->prepare("INSERT INTO book(thing_id, person_id) VALUES(?,?)");
for ($i = 0; $i < count($values); $i++) {
    if (!empty(trim($values[$i]))) {
        $new_values .= "('" . trim($values[$i]) . "')";
    }
    if ($control == $i) {
        $new_values .= ";";
    } else $new_values .= ",";
}
    $thing->bind_param("ii", $thing_id, $values[$i]); // using integer because I insert data into a junction table that accepts only ID values)
    $thing->execute();

【问题讨论】:

  • 使用 WHERE writer_name IN ($writer_name) 您可以传递 IN 逗号分隔的列表,它将返回 writer_name 在列表中的那些记录。参见示例:techonthenet.com/sql/in.php
  • 此外,SQL 比您想象的要强大得多。您的大部分 PHP 代码都可以被抛弃,并将工作转移到数据库中。
  • ... = '$values_select[]' 是“不可能”的代码。您正在生成文字查询文本... = 'Array[]',它不会匹配任何内容。
  • @i-CONICA,我现在会调查。谢谢。
  • @Marc B,我用它作为一个虚拟文本来展示它,不知道该放什么。

标签: php mysql mysqli explode


【解决方案1】:

您可以查询所有数组值:

$who_finish = array();
while(list($k, $v)=each($values_select)) {
    $v = $sqli->real_escape_string(trim($v));
    $who = "SELECT writer_id FROM writer_name WHERE writer_name = '$v'";
    $who_result = $sqli->query($who);
    $who_row = $who_result->fetch_array();
    $who_finish[] = $who_row['writer_id'];
}

或更好(顺便说一句,您检查错别字等吗?)是像这样一次查询: SELECT writer_id, writer_name FROM writer_name WHERE writer_name IN ("Franz Kafka", "Agatha Christie", "George Bernard Shaw")

将值插入表中(我不太了解您的代码,所以在这里假设):

$new_values_q = $sqli->prepare("INSERT INTO book(thing_id, person_id) VALUES(?,?)");

while(list($k, $v)=each($who_finish)) {
    $new_values_q->bind_param("ii", $thing_id, $v); // $v should be author_id
    $new_values_q->execute();
}
$new_values_q->close();

【讨论】:

  • 我现在不检查拼写错误(但会),因为我从同一资源批量复制/粘贴值,所以所有记录都输入正确。我现在正在尝试您的解决方案。
  • 此查询有效,但我仍然无法进行插入。回声 $who_finish[0]; // 给出第一个作者的 ID echo $who_finish[1]; // 给出第二个作者的 ID echo $who_finish[2]; // 给出第三个作者的 ID 但是我怎样才能使用循环插入这些呢?
  • @salep 我添加了插入片段来回答,但我不太了解你的代码,所以我假设你需要什么。
【解决方案2】:

它可能会有所帮助,但未经测试。

 $writer_name = "Franz Kafka, Agatha Christie, George Bernard Shaw";

$values_select = explode(",", $writer_name);

foreach($values_select as $sel){
    $query = "INSERT INTO book (thing_id, person_id)
SELECT $thing_id, location
FROM   writer_name
WHERE  writer_name  = ".trim($sel);
$sqli->query($query);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 2023-04-11
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多