2012-07-18 3 views
1

SQL 문을 생성하는 코드가 올바르게 작동합니다. 그러나 $ stmt-> bind_param에 대한 문자열을 생성 할 때 딸꾹질이 발생합니다. 다음과 같이 코드는 다음과 같습니다PHP mysqli prepare - 동적으로 생성

$stmt = $mysqli->stmt_init(); if ($stmt->prepare ($sql)) { $bind_types = '"'; $bind_values = '';

if ($action == 'insert' || $action == 'update') { 
     reset ($array); 
     foreach ($array as $key => $value) { 
      if (is_string ($value)) { $type = 's'; } else if (is_int ($value)) { $type = 'i'; } else if (is_float ($value)) { $type = 'd'; } else { die ('Cannot determine type for ' . $key . ' => ' . $value . ''); } 
      $bind_types .= $type; 
      $bind_values .= $value . ', '; 
      //$stmt->bind_param ($type, $value); 
     } 
    } 

    if ($action == 'update' || $action == 'delete') { 
     if (is_string ($id_value)) { $type = 's'; } else if (is_int ($id_value)) { $type = 'i'; } else if (is_float ($id_value)) { $type = 'd'; } else { die ('Cannot determine type for ' . $id_column . ' => ' . $id_value . ''); } 
     $bind_types .= $type; 
     $bind_values .= $id_value . ', '; 
     //$stmt->bind_param ($type, $id_value); 
    } 

    $bind_types .= '"'; 

    $bind_values = substr ($bind_values, 0, -2); 

    echo $bind_types . ', ' . $bind_values; 

    $stmt->bind_param ($bind_types, $bind_values); 
    $stmt->execute(); 

} 

은 그 서식이 엉망이되었다. 읽을 수 없다면 사과드립니다.

나는 다음과 같은 오류가 점점 오전 :

"경고 : mysqli_stmt :: bind_param() [mysqli - stmt.bind-PARAM] : 유형 정의 문자열에있는 요소의 수에 바인드 변수의 수와 일치하지 않습니다 ... "

아이디어가 있으십니까?

+0

그래서 많은'mysql_'와'마지막 시간에 mysqli'이 ... [PDO] 사용이 해킹 못생긴 볼 바인딩하려면 /book.pdo.php). –

+0

나는 그것을 조사하고 있었다. 그러나 mysqli 대 PDO 사용에 대한 주장은 양측 모두에서 훌륭합니다. mysqli가 굴리는 방법이라고 생각했습니다. 아마. –

+0

나는 많은 논의가 있었다는 인상을 받고 있지는 않았지만 지금은 논점을 살펴 보겠다. –

답변

2

PDO는 쉽게 사용할 수 있으므로 사용하는 것이 좋습니다. mysqli에서 이것을하고 싶다면 동적으로 쉽게 바인딩 할 수 없기 때문에 더 복잡하다. 는 http://us2.php.net/manual/en (그들이 동적으로

$bind_values= explode(',', $bind_values); 
call_user_func_array(array($stmt, 'bind_param'), makeValuesReferenced($bind_values)); 
$stmt->execute(); 

function makeValuesReferenced(&$arr){ 
    $refs = array(); 
    foreach($arr as $key => $value) 
     $refs[$key] = &$arr[$key]; 
    return $refs; 

} 
+0

지금 당장 PDO를 살펴보고이 테스트 코드를 테스트 소켓으로 마이그레이션 할 가능성이 높습니다. 또한 실제로 내 질문에 답했습니다. 감사합니다. –

0

bind_param에 대한 귀하의 전화가 잘못이다 : 그것은해야한다 :

그 각각의 값은 실제 변수입니다
bind_param($types, $value1, $value2, $value3 ...); 

.

+0

그 점을 이해합니다. 코드를 자세히 보면 루프는 $ bind_types와 $ bind_values를 생성합니다. 그런 다음 bind_param 호출에 사용하고 있습니다. 그 두 문자열의 결과가 맞지만 여전히 문제가 될 수 있습니다 용의자. –

+0

'$ bind_values'는 문자열이고,'bind_param'은 문자열을 두 번째 매개 변수로 사용하지 않습니다. –

+0

나는 그것을 의심했다. 젠장. –