2016-12-20 1 views
0

mysql_ *을 PDO로 변환하려하지만이를 수행 할 수 없습니다. 계속 "SQLSTATE [HY093] : 바인딩 된 변수 수가" 오류의 토큰 수와 일치하지 않습니다. 그러나 이것을 묻기 전에 또 다른 조언을 구하라.참여 방법 메소드와 바운드 변수의 수가 일치하지 않습니다. 오류

나는 학생 수 : LESSONBOUGHT AND ACCOUNT 내 INNODB 내에 studentsons와 lessonsbought_id 및 account_id를 연결했다. 또한 students_id 열 에 "lessonsbought""accounts" 테이블도있었습니다. 그리고 나의 오래된 mysql_로에 * 나는 왼쪽을 사용하던 코드는 을 가진 후 ..이 일반적인 "students_id" 행을 기반으로 지금

그러나이 결과를 보여주기 위해 가입 "SQLSTATE는 [HY093] : 바운드 변수의 수는 일치하지 않습니다 나는이 같은 결과를 보여 외래 키에 연결하려고 " 오류 토큰 번호 :

foreach($db->query("SELECT * FROM students s1 LEFT JOIN lessonsbought l1 ON s1.students_id = l1.lessonsbought_id LEFT JOIN account a1 ON s1.students_id = a1.account_id")as $row) 

이전 버전은했다 : 첫째

foreach($db->query("SELECT * FROM students s1 LEFT JOIN lessonsbought l1 ON s1.students_id = l1.students_id LEFT JOIN account a1 ON s1.students_id = a1.students_id")as $row) 

, 어느 쪽이 더 나은 무엇입니까?

두 번째 질문 : 삽입 데이터 페이지에 삽입 코드를 어떻게 형성합니까?

편집 사전에

<?php 
if(isset($_POST['send'])) 
{ 
    try{ 
    $db = new PDO ('mysql:host=localhost;dbname=MY-DB-NAME;charset=utf8','MY-DB-USERNAME','MY-DB-PASSWORD'); 
    } 
    catch(PDOException $exc) 
    {echo 'Failed while insert operation'. $exc->getMessage(); 
     exit(); 
    } 


    $students_name = $_POST['students_name'];  
    $students_phone = $_POST['students_phone']; 
    $students_email = $_POST['students_email']; 
    $students_status = $_POST['students_status']; 
    $students_first_level = $_POST['students_first_level']; 
    $students_reg_date = $_POST['students_reg_date']; 

    $lessonsbought_lesson_type = $_POST['lessonsbought_lesson_type'];  
    $lessonsbought_total_hours = $_POST['lessonsbought_total_hours']; 

    $account_all_cost = $_POST['account_all_cost'];  
    $payment_method = $_POST['payment_method']; 
    $discount = $_POST['discount']; 
    $payment_done = $_POST['payment_done']; 
    $payment_waiting = $_POST['payment_waiting']; 

    $pdoQuery ="INSERT INTO students(students_name,students_phone,students_email,students_status,students_first_level,students_reg_date) VALUES (:students_name,:students_phone,:students_email,:students_status,:students_first_level,:students_reg_date)"; 
    $last_id = $db->lastInsertId(); 
    $pdoQuery ="INSERT INTO lessonsbought(lessonsbought_lesson_type,lessonsbought_total_hours,students_id) VALUES (:lessonsbought_lesson_type,:lessonsbought_total_hours,:last_id)"; 
    $pdoQuery ="INSERT INTO account(account_all_cost,payment_method,discount,payment_done,payment_waiting,students_id) VALUES (:account_all_cost,:payment_method,:discount,:payment_done,:payment_waiting,:last_id)"; 


    $pdoResult = $db->prepare($pdoQuery); 

    $pdoExec = $pdoResult->execute(array(":students_name"=>$students_name,":students_phone"=>$students_phone,":students_email"=>$students_email,":students_status"=>$students_status,":students_first_level"=>$students_first_level,":students_reg_date"=>$students_reg_date, 
    ":lessonsbought_lesson_type"=>$lessonsbought_lesson_type,":lessonsbought_total_hours"=>$lessonsbought_total_hours,":students_id"=>$last_id, 
    ":account_all_cost"=>$account_all_cost,":payment_method"=>$payment_method,":discount"=>$discount,":payment_done"=>$payment_done,":payment_waiting"=>$payment_waiting,":students_id"=>$last_id)); 

    if($pdoExec) 
    { 
     echo 'Success! Data Insert Done'; 
    }else{ 
     echo 'Failed While Data Insert Operation'; 
    } 
} 
?> 

감사합니다 (이 예제는 mysql_로 * 버전에서 변환을 시도했다) : 테이블 이름 "muhasebe"에서 업데이트 첫 번째 질문은 "계정"

답변

0

하기 위해, students.student_idlessonsbought.lesson_id을 합치는 것은 의미가 없습니다. 이러한 열은 서로 관련이 없습니다. 가입시 외래 키를 사용해야하므로 ON s1.student_id = l1.student_id이어야합니다. studentsaccounts을 합치는 경우에도 마찬가지입니다.

$pdoQuery에 할당 할 때마다 이전 값으로 대체됩니다. 따라서 $db->prepare($pdoQuery);을 호출하면 INSERT INTO muhasebe 인 마지막 쿼리를 준비하는 중이고 6 개의 자리 표시자가 있습니다. 그런 다음 $pdoResult->execute()을 호출하면 배열에 다른 쿼리의 자리 표시 자 값이 있지만이 쿼리에 해당 자리 표시자가 없으므로 오류가 발생합니다.

PDO에서는 한 번의 호출로 여러 쿼리를 결합 할 수 없습니다. 각 검색어에 대해 execute() 통화를 별도로 만들어야합니다.

$pdoQuery ="INSERT INTO students(students_name,students_phone,students_email,students_status,students_first_level,students_reg_date) VALUES (:students_name,:students_phone,:students_email,:students_status,:students_first_level,:students_reg_date)"; 
$pdoResult = $db->prepare($pdoQuery); 
$pdoResult->execute(array(":students_name"=>$students_name,":students_phone"=>$students_phone,":students_email"=>$students_email,":students_status"=>$students_status,":students_first_level"=>$students_first_level,":students_reg_date"=>$students_reg_date)); 
$last_id = $db->lastInsertId(); 

$pdoQuery ="INSERT INTO lessonsbought(lessonsbought_lesson_type,lessonsbought_total_hours,students_id) VALUES (:lessonsbought_lesson_type,:lessonsbought_total_hours,:students_id)"; 
$pdoResult = $db->prepare($pdoQuery); 
$pdoResult->execute(array(":lessonsbought_lesson_type"=>$lessonsbought_lesson_type,":lessonsbought_total_hours"=>$lessonsbought_total_hours,":students_id"=>$last_id)); 

$pdoQuery ="INSERT INTO muhasebe(account_all_cost,payment_method,discount,payment_done,payment_waiting,students_id) VALUES (:account_all_cost,:payment_method,:discount,:payment_done,:payment_waiting,:students_id)"; 
$pdoResult = $db->prepare($pdoQuery); 
$pdoResult->execute(array(":account_all_cost"=>$account_all_cost,":payment_method"=>$payment_method,":discount"=>$discount,":payment_done"=>$payment_done,":payment_waiting"=>$payment_waiting,":students_id"=>$last_id)); 
관련 문제