2009-11-04 2 views
7

평소와 마찬가지로 저는 PHP를 사용하여 모범 사례를 살펴 보았으며 준비된 문구가 지금 내 눈을 감 으려면 어떻게해야할까요? 그래서 나는 발견 한 몇 가지 예를 가지고 놀기 시작했습니다. 스크립트를 실행할 때bindParam()에서 Mysqli Prepared Statement가 작동하지 않습니다.

이 나는이 오류를 가지고 :

Fatal error: Call to a member function bindParam() on a non-object in /opt/lampp/htdocs/phpSecurity/PreparedStatments/Insert-Multi-Binded-Params/Insert Simple Method.php on line 10

을 여기 코드를 간다.

Method.php

<?php 
require_once '../config.php'; 

$stmt = $db->prepare("INSERT INTO coisas (nome, telefone, bi) VALUES (?, ?, ?)"); 

$nome = 'Fabio Antunes'; 
$telefone = 916810641; 
$bi = 123093456; 

$stmt->bindParam(1, $nome); 
$stmt->bindParam(2, $telefone); 
$stmt->bindParam(3, $bi); 

$stmt->execute(); 

$stmt->close(); 

$db->close(); 
?> 

config.php를

<?php 
$server_host = 'localhost'; 
$server_user = 'root'; 
$server_password = ''; 
$server_db = 'PreparedStatements'; 
$db = new mysqli($server_host, $server_user, $server_password, $server_db); 
?> 

간단한 삽입하지 내가 여기에 잘못하고 있어요 무엇인지,이 php.net에서 발견 유사한 예는, 왜 일하지 않는거야? 추 신 : mysqli 연결은 SELECT 명령으로 준비된 문을 수행하기 위해 사용했기 때문에 문제가되지 않습니다. 그리고 꽤 잘했습니다.


편집

해상도와 이유.

글쎄 example에 나는 쿼리의 각 값에 대해 bind_param()을 사용해야합니다. 하지만 Bart 덕분에 그는 제 코드로 문제를 해결할 수있었습니다. 그것이

는 :

$stmt->bindParam(1, $nome); 
$stmt->bindParam(2, $telefone); 
$stmt->bindParam(3, $bi); 

이 있어야한다 "SII"이 무엇인지 궁금 수있는 사람들을 위해 이제

$stmt->bind_param("sii", $nome, $telefone, $bi); 

.

글쎄 bind_param은 "$ var"를 각 물음표에 "?"바인딩합니다. 순서대로.

따라서 하나만 사용하면 bind_param()을 모두 동시에 바인딩 할 수 있으며 보통 bind_param()을 사용하면 바인딩되는 데이터 유형을 지정해야합니다.

바인딩 할 첫 번째 값은 $nome "s"로 지정된 문자열입니다.

다른 사람은 $telefone$bi은 "i"를 가지고 있기 때문에 정수입니다.

여기 비슷한 문제가있는 다른 사람들은 다른 데이터 유형 (php.net)을 사용합니다.

i = Integer;

s = String;

d = Double;

b = Blob;

누군가 더 좋은 설명으로 게시하거나 의견을 남기십시오. 그래서 나는 내 자신을 향상시킬 수 있습니다.

감사합니다.

답변

6

당신은 연결 문제 아무것도 생각할 수 있지만 확실히 확인해야합니다 :

$db = new mysqli($server_host, $server_user, $server_password, $server_db); 
if (mysqli_connect_errno()) { 
    printf("DB error: %s", mysqli_connect_error()); 
    exit(); 
} 

편집 :

$stmt = $db->prepare("INSERT INTO coisas (nome, telefone, bi) VALUES (?, ?, ?)"); 
$stmt->bind_param("sii", $nome, $telefone, $bi); 
$stmt->execute(); 

을 : 당신이 할 때 발생하는

?

테이블 coisas의 철자가 맞습니까?

+0

모범 사례에 대한 좋은 제안. 시도했지만 문제가 해결되지 않았습니다. 다른 생각? –

+0

$ stmt-> bind_param ("sii", $ nome, $ telefone, $ bi); 일했다. –

+0

반갑습니다. –

2

$ stmt에서 print_r을 4 행째에 가져온 후 수행하십시오. 실제 개체입니까? 나는 추측하고있다.

+0

그게 무슨 일을할지 모르겠지만. 문제는 내가 각 값에 대해 bind param을 사용함에 따라 하나만 사용할 수 있었고 값 입력 유형 (s = string | i = integer)을 언급하지 않았다는 것입니다. 고마워. –

+0

오류는 메서드를 호출하는 개체 ($ stmt)가 실제로 개체가 아니라는 사실을 나타냅니다. 그 방법 안에서 그 일이 일어날 수 있었지만, 처음에는 null $ stmt이었습니다. – Zak

관련 문제