winsderlich@yahoo.fr Ответов: 2

Как сделать вставку нескольких строк


у меня есть фрагмент кода, который я написал в mysqli, чтобы вставить несколько строк данных в базу данных.код действительно работает.я пытаюсь написать тот же код в PDO, но мне возвращается ошибка
<pre lang="PHP"> Catchable fatal error: Object of class PDOStatement could not be converted to string in C:\wamp64\www\test\Nouveau dossier\quiz\index.php on line 148


я действительно не понимаю, в чем проблема.Пожалуйста, помогите.
это фрагмент кода в mysqli
 if (isset($_POST['register']) && !empty($_POST['answer1']) && !empty($_POST['answer2']) 
 && !empty($_POST['answer3']) && !empty($_POST['answer4'])) {

     $answer1 = $_POST['answer1'];
     $answer2 = $_POST['answer2'];
     $answer3 = $_POST['answer3'];
     $answer4 = $_POST['answer4'];

     $servername = "localhost";
     $username = "root";    
 $password = "";
     $dbname = "test";
    
     $con = new mysqli($servername, $username, $password, $dbname);
     if($con->connect_error){
         die("Connection to db failed:" .$con->connect_error);
     }
    
     //Create an array and fill it with values coming from the form
     $answers_array = array(
         array('AnswerText' => $answer1, 'AnswerStatus' => 0, 'QuestionId' => 1),
        array('AnswerText' => $answer2, 'AnswerStatus' => 0, 'QuestionId' => 1),
         array('AnswerText' => $answer3, 'AnswerStatus' => 1, 'QuestionId' => 1),
         array('AnswerText' => $answer4, 'AnswerStatus' => 0, 'QuestionId' => 1)     );
       $sql = "INSERT INTO answers (AnswerText, AnswerStatus, QuestionId) VALUES ";
    
    $total = count($answers_array);
    
     $iterator = new ArrayIterator($answers_array);
    
//     //Iterate over the values in the object ArrayObject
     while($iterator->valid()){
        $currentItem = $iterator->current();
         $sql .="('".$currentItem['AnswerText']."','".$currentItem['AnswerStatus']."','".$currentItem['QuestionId']."')";
        

//$sql.='('.$currentItem['AnswerText'].','.$currentItem['AnswerStatus'].','.$currentItem['QuestionId'].')';/         $iterator->next();
         $sql .= $iterator->key()? ',' : ';';
     }
    
    //Now we insert the data into the database
   /* $con = mysql_connect($servername, $username, $password);
    mysql_select_db($dbname, $con);
    mysql_query($sql, $con);*/
    

     if ($con->multi_query($sql) === TRUE) {
        echo "New records created successfully";
     } else 
     {
         echo "Error: " . $sql . "<br>" . $con->error;
     }
    
     $con->close();
 }else
 echo "Please, fill the form fields !";



заранее спасибо

Что я уже пробовал:

это тот же самый код в PDO


if (isset($_POST['register']) && !empty($_POST['answer1']) && !empty($_POST['answer2']) 
&& !empty($_POST['answer3']) && !empty($_POST['answer4'])) {

    $answer1 = $_POST['answer1'];
    $answer2 = $_POST['answer2'];
    $answer3 = $_POST['answer3'];
    $answer4 = $_POST['answer4'];

    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "test";
    $con = new PDO('mysql:$servername;$dbname', $username, $password);
$answers_array = array(
    array('AnswerText' => $answer1, 'AnswerStatus' => 0, 'QuestionId' => 1),
    array('AnswerText' => $answer2, 'AnswerStatus' => 0, 'QuestionId' => 1),
    array('AnswerText' => $answer3, 'AnswerStatus' => 1, 'QuestionId' => 1),
    array('AnswerText' => $answer4, 'AnswerStatus' => 0, 'QuestionId' => 1)
);

$sql=$con->prepare("INSERT INTO answers (AnswerText, AnswerStatus, QuestionId) VALUES ");

$total = count($answers_array);

$iterator = new ArrayIterator($answers_array);

//Iterate over the values in the object ArrayObject
 
while($iterator->valid()){
    
    $currentItem = $iterator->current();
 $sql .="('".$currentItem['AnswerText']."','".$currentItem['AnswerStatus']."','".$currentItem['QuestionId']."')";// line 148
    
//$sql.='('.$currentItem['AnswerText'].','.$currentItem['AnswerStatus'].','.$currentItem['QuestionId'].')';
    $iterator->next();
    $sql .= $iterator->key()? ',' : ';';
    };
    
    

//Now we insert the data into the database
/* $con = mysql_connect($servername, $username, $password);
mysql_select_db($dbname, $con);
mysql_query($sql, $con);*/


if ($sql === TRUE)  {
    echo "New records created successfully";
} else 
{
    echo "Error: " . $sql . "<br>" . $con->error;
}

$con->close();
}else
echo "Please, fill the form fields !";

ниже приведена форма, из которой я получаю свои ценности
 <form action="index.php" method="POST">
    <legend>This form helps type in answers proposition to question</legend>
    <br>
    <label for="Answer1">Answer 1 :</label>
    <br>
    <textarea name="answer1" id="answer1" cols="90" rows="5">Bonjour le monde</textarea>

    <br>
    <label for="Answer2">Answer 2 :</label>
    <br>
    <textarea name="answer2" id="answer2" cols="90" rows="5">Hello world</textarea>
<br>

    <label for="Answer3">Answer 3 :</label>
    <br>
    <textarea name="answer3" id="answer3" cols="90" rows="5">Mè tsa téh</textarea>
<br>

    <label for="Answer4">Answer 4:</label>
    <br>
    <textarea name="answer4" id="answer4" cols="90" rows="5">Guten tag</textarea>
    <br>

    <input type="submit" name="register" value="Save">
    </form>
</body>

Richard MacCutchan

"Я действительно не понимаю, в чем проблема"
Согласно сообщению об ошибке, он находится на линии 148. Но поскольку мы понятия не имеем, что это за линия, трудно что-либо предложить.

Patrice T

Какая линия 148 ?

winsderlich@yahoo.fr

$sql .="('".$currentItem['AnswerText']."','".$currentItem['AnswerStatus']."','".$currentItem['QuestionId']."')";// строка 148

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

2 Ответов

Рейтинг:
20

Wendelius

Похоже, что вы готовите инструкцию, используя только часть запроса insert. Позже вы попытаетесь связать больше текста SQL с подготовленным оператором, таким образом, сообщение об ошибке.

Чтобы устранить проблему, сначала постройте целое утверждение, а затем используйте его для prepare вызов.

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

Например, см. PHP: PDOStatement::bindParam - руководство пользователя[^]


winsderlich@yahoo.fr

я пытаюсь понять что ты сказал И вот что я сделал

$sql="вставить в ответы (AnswerText, AnswerStatus, QuestionId) значения ";

$Итого = сумма($answers_array);

$iterator = новый ArrayIterator($answers_array);

//Итерация по значениям в объекте ArrayObject

while($iterator->valid()){

$currentItem = $iterator->current();

$sql .="('".$currentItem['AnswerText']."','".$currentItem['AnswerStatus']."','".$currentItem['QuestionId']."')";

$iterator->next();
$sql .= $iterator->ключ()? ',' : ';';
$среда SQL=$Кон-и GT;метод prepare($SQL и);

$total=$sql->fetchColumn();
};

Wendelius

Я имею в виду, что вы сначала подготовите заявление с привязками. Затем в дальнейшем вы используете подготовленный оператор и между исполнениями меняете значения параметров.

Рассмотреть следующее

$sql = "INSERT INTO answers (AnswerText, AnswerStatus, QuestionId) VALUES (:AnswerText, :AnswerStatus, :QuestionId)"
$stmt=$con->prepare($sql)
$stmt->bindParam(':AnswerText', $answer, PDO::PARAM_STR, 100);
$stmt->bindParam(':AnswerStatus', $status, PDO::PARAM_INT);
$stmt->bindParam(':QuestionId', $id, PDO::PARAM_INT);
...
while loop...
   $answer=...
   $status=...
   $id=...
   $stmt->execute();
...

winsderlich@yahoo.fr

спасибо за ваше решение оно мне помогло

Рейтинг:
12

Patrice T

$sql .="('".$currentItem['AnswerText']."','".$currentItem['AnswerStatus']."','".$currentItem['QuestionId']."')";

Не обязательно решение вашего вопроса, но у вас есть еще одна проблема.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


winsderlich@yahoo.fr

спасибо за попытку использовать параметры и привязать их к ним

Patrice T

Попробуйте вставить 1 запись в то время, это будет проще с параметрами.