2015-01-08 7 views
6

मैं अब तालिका में खेतों और मूल्यों के रूप में उसके प्रमुख के साथ साहचर्य सरणी में डेटा डालने में समस्या हो रही उपयोग करते हुए में डेटा सम्मिलित करने के लिए कैसे MySql डेटाबेस में सम्मिलित करने के। मेरा कोड यहाँ है।एक साहचर्य सरणी

<?php 
$table = 'articles'; 

$data = array(
     'title' => 'Header', 
     'content' => 'This is content', 
     'author' => 'James'); 

$keys = implode(', ', array_keys($data)); 
$values = implode(', ', array_values($data)); 

$sql = 'insert into '.$table.'('.$keys.') values ('.$values.')'; 

$db = new mysqli('localhost', 'root', 'root', 'blog'); 
$db->query($sql); 
?> 
इस कोड के साथ

, मैं तो मैं क्वेरी स्ट्रिंग बाहर प्रतिध्वनित करने के लिए कोशिश डेटाबेस में डेटा सम्मिलित करने के लिए सक्षम नहीं था और मैं कुछ इस तरह है:

insert into articles(title, content, author) values (Header, This is content, James) 

हालांकि, अगर मैं प्रत्येक मान में एकल उद्धरण का उपयोग करें

मैं डेटा को डेटाबेस में सफलतापूर्वक सम्मिलित कर सकता हूं।

तो मैं यहाँ क्या गलत है पता नहीं है। क्या यह उद्धरण चिह्न के साथ एक समस्या है या नहीं क्योंकि जब मैं एकल उद्धरण का उपयोग करता हूं, तो यह काम करता प्रतीत होता है।

तो मदद कृपया मुझे इस के लिए उचित समाधान खोजने के ... क्वेरी आप उद्धरण में प्रत्येक मान शामिल करनी लिए

+0

स्ट्रिंग चर के चारों ओर सिंगल कोट्स की आवश्यकता है। – vaso123

+2

ऐसा लगता है कि आपने अपने प्रश्न का उत्तर दिया है। हालांकि, आपको अपने मूल्यों से ठीक से बचने की आवश्यकता होगी (या एक तैयार कथन का उपयोग करें) और सुनिश्चित करें कि आपकी कुंजी मान्य कॉलम नाम हैं और उदाहरण के लिए आरक्षित शब्दों को शामिल नहीं किया गया है जिन्हें बैकटिक्स का उपयोग करके उद्धृत करने की आवश्यकता है। – jeroen

+0

आप त्रुटियों की जांच नहीं कर रहे हैं; कर। 'अगर (! $ परिणाम = $ डीबी-> क्वेरी ($ sql)) { मरें ('क्वेरी चलाने में त्रुटि हुई ['। $ db-> त्रुटि। ']'); } ' –

उत्तर

7

। है कि आप अपने फटना बयान बदल सकते हैं मूल्यों के आसपास के उद्धरण शामिल करने के लिए ऐसा करने के लिए -

$values = "'" .implode("','", array_values($data)) . "'"; 

आप त्रुटियों के लिए जाँच की जानी चाहिए।

if(!$result = $db->query($sql)){ 

die('There was an error running the query [' . $db->error . ']'); 

} 

else{ 
echo "Data inserted."; 
} 
+1

आप आदमी ;-) –

+1

मैं सिर्फ आदमी से बात कर रहा हूं। ;-) –

+1

आपको बहुत बहुत धन्यवाद। आपने अभी दिन बचा लिया है! –

1

साथ $db->query($sql);

बदलें तो मैं यहाँ क्या गलत है पता नहीं है। क्या यह उद्धरण चिह्न के साथ एक समस्या है या नहीं क्योंकि जब मैं एकल उद्धरण का उपयोग करता हूं, तो यह काम करता प्रतीत होता है।

हां, आपको एकल उद्धरण का उपयोग करने की आवश्यकता है। ऐसा लगता है जैसे

$values = implode(', ', array_values($data)); 

कुछ में:

आप इसे देख सकते हैं

$values = implode (',', array_map (
function ($z) 
{ 
return ((is_numeric ($z) || (is_string ($z) ? ($z == "NOW()" ? true : false) : false) || (is_array ($z)?(($z=implode(";",$z))?false:false):false)) ? $z : "'" . utf8_decode ($z) . "'"); 
}, array_values ($data))); 

विचार है कि आप हर मूल्य क्षेत्र उद्धृत करना है, मैं क्वेरी में मान फ़ील्ड से मान फ़ील्ड का मतलब । उदाहरण के लिए, मेरे उदाहरण में, फ़ंक्शन स्ट्रिंग के रूप में अब() को अनदेखा करता है, और इसे SQL के टाइमस्टैम्प के रूप में काम करने के लिए रखता है। क्योंकि यदि आप इसे स्ट्रिंग प्रकार के रूप में देखते हैं, तो आदेश ठीक से काम नहीं करेगा।


वैसे भी, ऊपर बदसूरत और असुरक्षित है।

मैं तुम्हें सलाह RedBeanORM जैसे कुछ ORM के लिए देखो या, हो सकता है, MySQLi तरह उचित PHP MySQL संस्करण का उपयोग करने होगा। मुख्य रूप से एसक्यूएल इंजेक्शन से बचने के लिए।

require 'rb.php'; 
R::setup(); 

$post = R::dispense('post'); 
$post->text = 'Hello World'; 

$id = R::store($post);  //Create or Update 
$post = R::load('post',$id); //Retrieve 
R::trash($post);    //Delete 

एक PHP MySQL संस्करण उदाहरण सुधार देखो:

$stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)"); 
mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent); 
$code = 'DEU'; 
$language = 'Bavarian'; 
$official = "F"; 
$percent = 11.2; 
mysqli_stmt_execute($stmt); 

गुड लक


एक ORM उदाहरण देखो। अच्छी शिक्षा

+0

नए ज्ञान के लिए बहुत बहुत धन्यवाद। मुझे अध्ययन करने के लिए बहुत सी चीजें मिलीं ... –

+0

आपका स्वागत है। धन्यवाद। –

1

स्थितीय जगह धारकों:

$values = implode(', ', 
    array_fill(0, count($data), '?') 
); 
// insert into articles(title, content, author) values (?, ?, ?) 

नामित स्थान धारकों:

$values = implode(', ', array_map(
    function($value){ 
     return ":$value"; 
    }, 
    array_keys($data) 
)); 
// insert into articles(title, content, author) values (:title, :content, :author) 

नहीं जरूरी सबसे अच्छा या सबसे अच्छा कोड।

पैरामीटर सरणी के बारे में, मैं mysqli से परिचित नहीं हूं लेकिन कई डीबी एक्सटेंशन के साथ आप $data का उपयोग कर सकते हैं।

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