Как вставить несколько строк данных в таблицу MySQL, используя php? - PullRequest
1 голос
/ 02 декабря 2010

У меня есть таблица в MySQL, в которой содержатся созданные пользователем вопросы против ботов.Однако при установке таблиц я хочу заранее вставить некоторые вопросы по умолчанию для защиты от ботов.Я придумал следующий код, но я не уверен, как именно ввести его в правильный синтаксис.По сути, я создал два массива (один для вопросов, а другой для ответов в соответствующем и соответствующем порядке) и хочу циклически проходить по каждой паре вопросов и ответов с помощью функции foreach () или, возможно, функции while ().1002 * Вот мой код:

$questions = array(
 "question1"   =>   "What is 2+6?",
 "question2"   =>   "What color is the sky?",
 "question3"   =>   "What number is betwee 6 and 8?",
 "question4"   =>   "How many letters are there in the English alphabet?",
 "question5"   =>   "How many hours are there in a day?",
 "question6"   =>   "Are you a human or a bot?"
);
$answers = array(
 "answer1"   =>   "8",
 "answer2"   =>   "blue",
 "answer3"   =>   "7",
 "answer4"   =>   "26",
 "answer5"   =>   "24",
 "answer6"   =>   "human"
);
$x = 0;
foreach ($question[$x]) {
$sql = "INSERT INTO
 administrator_instructions
  (question, question_naswer)
 VALUES
  ('" . $question[$x] . "','" . $answer[$x] . "')";
$x++;
}

Ответы [ 5 ]

1 голос
/ 02 декабря 2010

На самом деле, использование PDO будет намного быстрее, чем создание огромной строки запроса.

$db = new PDO("connect string");
$stm = $db->prepare("INSERT INTO administrator_instructions (question, question_naswer) VALUES(?,?)");
foreach( $q_a as $q => $a ) {
  if( $stm && $stm->execute(array($q, $a)) ) {
    // Handle insert
  } else {
    // Handle error
  }
}

Мало того, что запрос не нужно пересматривать каждый раз, каждый вызов передает только данные для подготовленного оператора. Кроме того, вы получите немедленный ответ, если вставка не удалась, и обработать его. Выполнение огромной одиночной вставки - это плохо, потому что, если она не удалась, вы не знаете, что было вставлено, а что нет, если только вы на самом деле не запросите все заново.

0 голосов
/ 02 декабря 2010

Что-то вроде:

$q_a = array(
    'what is 2 + 6' => '8',
    'what color is the sky?' => 'blue',
    // etc ...
}
$i = 0;
$cnt = count(array_keys($q_a));
$sql = 'insert into administrator_instructions (question, question_answer) values ';
foreach ($q_a as $q => $a) {
    $sql .= sprintf("('%s', '%s')", mysql_real_escape_string($q), mysql_real_escape_string($a));
    $i++;
    if($i < $cnt) $sql .= ", ";
}
0 голосов
/ 02 декабря 2010

Вы можете создать подобную команду и выполнить ее один раз

USE YourDB
GO
INSERT INTO MyTable (FirstCol, SecondCol)
SELECT 'First' ,1
UNION ALL
SELECT 'Second' ,2
UNION ALL
SELECT 'Third' ,3
UNION ALL
SELECT 'Fourth' ,4
UNION ALL
SELECT 'Fifth' ,5

для получения более подробной информации см. это

0 голосов
/ 02 декабря 2010
$questions = array(
 "0"   =>   "What is 2+6?",
 "1"   =>   "What color is the sky?",
 "2"   =>   "What number is betwee 6 and 8?",
 "3"   =>   "How many letters are there in the English alphabet?",
 "4"   =>   "How many hours are there in a day?",
 "5"   =>   "Are you a human or a bot?"
);
$answers = array(
 "0"   =>   "8",
 "1"   =>   "blue",
 "2"   =>   "7",
 "3"   =>   "26",
 "4"   =>   "24",
 "5"   =>   "human"
);
$row = array_combine($answers,$questions);

foreach($row as $k=>$v){
$sql = "INSERT INTO
 administrator_instructions
  (question, question_naswer)
 VALUES
  ('" . $k . "','" . $v . "')";
}

мне проще

вы избавляетесь от счетчика и можете просто сделать $ questions [] = "";$ ответы [] = "";каждый раз, когда вы хотите написать вопрос и ответы, вы избавляетесь от необходимости думать обо всех цифрах и обо всем и концентрируетесь на том, что важно

как это

@$questions[] =  "What is 2+6?";
 $questions[] = "What color is the sky?";
 $questions[] =  "What number is betwee 6 and 8?";
 $questions[] =  "How many letters are there in the English alphabet?";
 $questions[] =   "How many hours are there in a day?";
 $questions[] =  "Are you a human or a bot?";

 @$answers[] =   "8";
 $answers[] =   "blue";
 $answers[] =   "7";
 $answers[] =   "26";
 $answers[] =  "24";
 $answers[] =   "human";
0 голосов
/ 02 декабря 2010

что-то вроде этого сделало бы, плюс вам нужно выполнить sql в какой-то момент

$questions = array(
 "question1"   =>   "What is 2+6?",
 "question2"   =>   "What color is the sky?",
 "question3"   =>   "What number is betwee 6 and 8?",
 "question4"   =>   "How many letters are there in the English alphabet?",
 "question5"   =>   "How many hours are there in a day?",
 "question6"   =>   "Are you a human or a bot?"
);
$answers = array(
 "answer1"   =>   "8",
 "answer2"   =>   "blue",
 "answer3"   =>   "7",
 "answer4"   =>   "26",
 "answer5"   =>   "24",
 "answer6"   =>   "human"
);
$x = 0;
$sql = 'INSERT INTO
 administrator_instructions
  (question, question_naswer)
 VALUES'
for ($i = 0; $i < count($question); $i++) {
  if($i){
    $sql .= ','
  }
  $sql . = "('" . $question[$i] . "','" . $answer[$i] . "')";

}
mysql_query($sql);

mysql поддерживает некоторые пакетные вставки с этим синтаксисом (это не стандарт SQL)

INSERT INTO TABLE(col1,col2) VALUES(1,1),(2,2),(3,3)

Я также считаю, что было бы проще иметь такой массив

$questions_answers = array(
  array('q' => 'How are you?', 'a' => 'Good')
);
...