2012-04-17 3 views
1

저는 튜토리얼, 예제를 사용하고 내 문제에 대한 수많은 다른 질문을 살펴 보았지만 여전히 작동하지 않습니다. PHP가 비교적 새롭고 PDO에 대해 전혀 이해하지 못했습니다. 내 대학에서 준 감가 상각 된 코드를 없애기 위해 mysql보다는 mysqli로 코드를 변경했지만이 상황에서 도움이되지 못했습니다.mysqli_multi_query가 mysql db에 삽입되지 않았습니다.

누구든지 나를 위해이 문제에 대해 밝힐 수 있다면 매우 감사 할 것입니다. 다음은 내 코드 샘플은 다음과 같습니다

<?php /*connect to the db */ 
    $link=mysqli_connect("dbhost","user","pass"); 
    mysqli_select_db("db",$link); 

    /*checking connection*/ 
     if ($link->connect_errno) 
     throw new exception(sprintf("Could not connect: %s", $link->connect_error)); 

session_start(); 



     $insert_query=" 
     INSERT INTO testone_tbl (age,hours,flexibility,fastpaced,retailexp, 
     workedus,conviction,permit,education) 
     VALUES ('$age','$hours','$flexibility','$fastpaced','$retailexp','$workedus', 
     '$conviction','$permit','$education'); 
     INSERT INTO testtwo_tbl 
     (contribute,insales,initiative,success,alternatives,targets, 
     newthings,custfeed,incdevelop,standards,confident,stretch, 
     opportunities,polite,ideas,deadline,supported,duties) 
     VALUES ('$contribute','$insales','$initiative', 
     '$success','$alternatives','$targets','$newthings', 
     '$custfeed','$incdevelop','$standards','$confident','$stretch', 
     '$opportunities','$polite','$ideas','$deadline','$supported','$duties')"; 


    /*execute multi_query*/ 


mysqli_multi_query ($link, $insert_query);/*error1*/ 
/*close connection*/ 
if(!$link>connect_errno) $link->close(); /*error2*/ 

?> 

데이터는 모두이 작성된 양식 (마지막 양식) 이전 형태의 세션에서. 그러나 나는 또한이 오류가 발생합니다 : 경고 : mysqli_multi_query() mysqli 및 Warning: mysqli_close() expects parameter 1 to be mysqli 수 매개 변수 1 기대하고이 지난 며칠 동안 붙어있다! 미리 감사드립니다.

+0

이 코드는 실행되지 않습니다 (따옴표가 빠짐). 복사하여 붙여 넣기를 확인하십시오. –

+0

편집 됨, 사람들에게 코드를 넘기지 않고 닫는 비트를 놓치지 않기 위해 몇 개의 삽입기를 생략했습니다. – PurpleSmurph

답변

2

먼저 웹 호스트에서 다중 SQL 쿼리를 사용하도록 설정했는지 확인해야합니다.

일부 웹 호스트는 주입 공격을 방지하기 위해 단일 SQL 쿼리 만 허용합니다. 그러나, 당신은 같은 테이블에-삽입 멀티하려면

, 당신은 이런 식으로 그것을 할 수 :

또한
INSERT INTO tbl_name (col1, col2) 
    VALUES ('?', '?'), 
      ('?', '?'), 
      ('?', '?'); # inserts 3 records to the same table in one query 

당신이 사용할 수 PDO이있는 경우, 그것을 사용!

PDO 개체를 사용하면 준비된 문을 사용하여 쿼리를보다 안전하게 수행 할 수 있습니다. 예 :

는 데이터베이스 추상화 계층을 작성하는 경우
$db = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); 

$data = array($col1, $col2, $col3); 
$sql = "INSERT INTO tbl_name (col1, col2, col3) VALUES ('?', '?', '?');"; 
$query = $db->prepare($sql); # prepares the sql statement 
$query->execute($data); #binds the array of data to the ? 
         #question mark parameters, and executes. 

, 당신은 당신의 쿼리를 실행하는 코드를 다시 작성할 필요없이 데이터베이스 연결 모드를 변경할 수 있습니다.

또한 루프 및 쿼리를 수행하지 않는 이유가 있습니까? 예 :

데이터베이스 연결에 액세스하는 데 일부 기능이 사용되었을 수 있습니다. 이제 문제가되지 않습니다. 실제로 함수 내에서 데이터베이스 연결에 액세스하려고 시도하지 않는 한 (당신이 우리에게 말하지 않은 경우를 대비해서). 예 :

$db = new PDO("...", $user, $pass); 

$query = $db->prepare($sql); # works fine 

function executeQuery($sql) { 
    $query = $db->prepare($sql); # error: $db is not defined 
           # within the scope of this function 
    ... 
} 

PHP를 사용하여이 문제를 해결하려면 global 키워드를 사용하십시오. 예 :

$db = new PDO("...", $user, $pass); 

function executeQuery($sql) { 
    global $db; # use $db in the global scope 
    $query = $db->prepare($sql); # works fine 
    ... 
} 
+0

루핑을하지 않는 이유는 내가 처음이기 때문에 PDO를 이해하지 못하기 때문입니다. 그러나 루프 및 쿼리 아이디어가 좋게 보입니다. mysqli_multi_query를 사용하도록 설정 한 확인을 위해 웹 호스트에 이메일을 보냈습니다. 루프/어레이 아이디어를 살펴 보겠습니다. 감사합니다. (col)의 의미는 무엇입니까? – PurpleSmurph

+0

이 경우'col'은'tbl_name'의 필드 이름입니다. 나 자신의 테이블/필드 이름을 사용하는 대신 내 대답 일반 유지. 관심 없다면 코드에서 SINGLE-line 쿼리 작업을 실행합니까? @PurpleSmurf – Ozzy

+0

그것은 모든 mysql_ 등일 때했는데 문제가있는 곳인 mysqli로 바꿨다. 그 일을 정리해 주셔서 감사합니다. 내가 뭘보고 있는지 확신 할 수 없었습니다. 예를 들어, ("INSERT INTO tbl_one (age) VALUES 'data', (age2) VALUES 'data2'"; etc. – PurpleSmurph

0

$link은 mysqli 객체가 아닙니다. 연결하지 않았거나 어떤 시점에서 $link을 다른 것으로 재 할당했습니다.

또한 연결 직후에 연결을 확인해야합니다. 링크의 중간 작업 (이 경우 mysqli_select_db)은 설정된 모든 오류를 지 웁니다.

또한 mysqli에 객체 지향 및 프로 시저 스타일 인터페이스를 혼합 및 일치 시켜서는 안됩니다. 객체 지향 스타일은 훨씬 명확하지만 기존 코드를 변경하기가 어렵다면 절차 스타일을 고수하십시오.대신이 같은

연결 : 그것은 MySQL을 주입 공격에 활짝 열려 있기 때문에

$link = mysqli_connect("dbhost","user","pass", "db"); // no need for an extra db select 
if (mysqli_connect_errno()) { 
    throw new Exception("Could not connect: ".mysqli_connect_error()); 
} 

또한, 나는이 실제 코드가 아닙니다 바랍니다. 다중 쿼리의 사용을 완전히 중단하고 준비된 문을 자리 표시 자와 함께 사용하는 것을 고려하십시오.

+0

젠장, 죄송합니다. 잘못된 코드를 올려 놓았습니다. 편집 할 시간을 좀주세요. 사과 드리겠습니다. – PurpleSmurph

+0

코드가 업데이트되었습니다. – PurpleSmurph

관련 문제