2009-11-04 13 views
7

सामान्य रूप से मैं PHP के साथ सर्वोत्तम प्रथाओं को देख रहा था, और तैयार वक्तव्य मुझे लगता है कि अब मुझे अपनी आंखों के साथ कैसे करना चाहिए। इसलिए मैंने कुछ उदाहरणों के साथ खेलना शुरू कर दिया।बिस्पाराम में माईस्की तैयार वक्तव्य() काम नहीं कर रहा है

मैं जब स्क्रिप्ट चलाने इस त्रुटि मिल गया है:

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 SQL आदेशों के साथ कुछ तैयार कथन करने के लिए उपयोग किया है। और बहुत अच्छी तरह से काम किया।


संपादित

संकल्प और क्यों।

अच्छी तरह से example में मुझे प्रश्न में प्रत्येक मान के लिए bind_param() का उपयोग करना चाहिए। लेकिन बार्ट के लिए धन्यवाद, वह मेरे कोड के साथ समस्या को हल करने में कामयाब रहे।

यह कहां है:

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

यह होना चाहिए:

$stmt->bind_param("sii", $nome, $telefone, $bi); 
जो लोग सोच सकता है कि "SII के लिए"

अब।

अच्छी तरह से bind_param जो मैं देखता हूं उसके लिए प्रत्येक प्रश्न चिह्न "$ var" को बांधता है "?" क्रम में।

तो एक bind_param() के साथ मैं उन्हें एक ही समय में बांध सकता हूं, और bind_param() के सामान्य उपयोग को बाध्य होने वाले डेटा के प्रकार को निर्दिष्ट करने की आवश्यकता होती है।

बाध्य होने वाला मेरा पहला मान $nome एक स्ट्रिंग है, जो "एस" द्वारा निर्दिष्ट है;

और अन्य $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

इसे Fabio सुनने के लिए अच्छा है। –

2

लाइन 4 पर वापस आने के बाद $ stmt पर print_r करें। क्या यह वास्तविक वस्तु है? मैं अनुमान लगा रहा हूँ।

+0

यकीन नहीं है कि यह क्या करेगा लेकिन। समस्या यह थी कि मैं प्रत्येक मान के लिए बाध्य परम का उपयोग करने के रूप में, मैं केवल एक का उपयोग कर सकता था, और मैंने मूल्य इनपुट प्रकार (एस = स्ट्रिंग | i = पूर्णांक) का उल्लेख नहीं किया था। फिर भी धन्यवाद। –

+0

त्रुटि ने इंगित किया कि ऑब्जेक्ट ($ stmt) जिसे आप एक विधि बुला रहे थे वास्तव में एक वस्तु नहीं थी। वह उस विधि के अंदर हो सकता था, लेकिन मेरा पहला अनुमान था कि यह पहली जगह में एक शून्य $ stmt था। – Zak

संबंधित मुद्दे