2012-09-05 10 views
6

एक साधारण PHP पीडीओ अपडेट फ़ंक्शन बनाने की कोशिश में यदि फ़ील्ड नहीं मिला है तो इसे डालने पर, मैंने यह छोटा स्निपेट बनाया था।PHP पीडीओ सरल सम्मिलन या अद्यतन फ़ंक्शन

function updateorcreate($table,$name,$value){ 
    global $sodb; 
    $pro = $sodb->prepare("UPDATE `$table` SET value = :value WHERE field = :name"); 
    if(!$pro){ 
     $pro = $sodb->prepare("INSERT INTO `$table` (field,value) VALUES (:name,:value)"); 
    } 
    $pro->execute(array(':name'=>$name,':value'=>$value)); 
} 

हालांकि यह पता नहीं लगा पाया है, तो अद्यतन समारोह if(!$pro); साथ काम करने के लिए जा रहा है कि हम इस एक काम कैसे होगा।

+2

पीडीओ उपयोग करने के लिए +1। –

+1

मैं अभी भी इसका उपयोग कर रहा हूं लेकिन मैं अपने एसक्यूएल –

+1

-1 पर वापस नहीं जा रहा हूं ['वैश्विक'] का उपयोग करने के लिए (http://stackoverflow.com/a/11923384/508666) – PeeHaa

उत्तर

14

आप तैयार करने के लिए $pro तैयार कर रहे हैं, निष्पादित कथन नहीं।

यह कहकर कि, यदि आप mysql का उपयोग कर रहे हैं तो आप insert... on duplicate key update वाक्यविन्यास का उपयोग कर सकते हैं।

insert into $table (field, value) values (:name, :value) on duplicate key update value=:value2 

आप एक ही बाध्य पैराम का दो बार उपयोग नहीं कर सकते हैं, लेकिन आप एक ही मूल्य पर दो बाध्य पैरा सेट कर सकते हैं।

संपादित करें: यह mysql वाक्यविन्यास केवल कार्य करेगा जहां एक कुंजी (प्राथमिक या अन्य अद्वितीय) मौजूद है और एक असफल असफल हो जाएगी।

+0

मैं mySQL का उपयोग कर रहा हूं लेकिन यह एक त्रुटि उत्पन्न कर रहा है –

+0

यह मैंने कोशिश की है: फ़ंक्शन अपडेटोरक्रेट ($ तालिका, $ नाम, $ मान) { \t वैश्विक $ sodb; \t $ समर्थक = $ sodb-> तैयार करें ("$ तालिका (फ़ील्ड, मान) मूल्यों में शामिल करें (नाम, मान) डिप्लिकेट कुंजी अपडेट मान =: value2"); \t $ pro-> निष्पादित करें (सरणी (': name' => $ name, ': value' => $ value, ': value2' => $ value)); } –

+0

@RobinKnight क्षमा करें, मुझे बल्ले से ठीक से इसका उल्लेख करना चाहिए था, आपके पास स्तंभ 'फ़ील्ड' हां के लिए तालिका पर एक अद्वितीय बाधा सेट है? – Fluffeh

0

आपको पहले इसे निष्पादित करने की आवश्यकता होगी।

इसके अलावा, यह करने का यह एक कठिन तरीका है। लेनदेन शुरू करना बेहतर होगा, एक चयन करें और फिर निर्धारित करें कि क्या करना है (INSERT या UPDATE)। बस यह जांच कर रहा है कि अद्यतन क्वेरी सफल हुई है या नहीं, यह तब भी सफल होता है जब कोई पंक्ति भी नहीं मिलती है।

+0

ठीक है, मैं यह देखने की कोशिश कर रहा था कि क्या हम उस चरण को बाईपास कर सकते हैं लेकिन यदि यह सुरक्षित नहीं है तो मैं –

+0

नहीं, यह सुरक्षित नहीं है। – Sherlock

+0

'SELECT' भी ऐसा करने का एक आसान तरीका है। बेहतर क्षेत्र में एक अनूठी कुंजी होगी, और उसके बाद 'INSERT ... डिप्लिकेट कुंजी अद्यतन ...' का उपयोग करें। – cHao

0

कोशिश,

PDO::exec() 

रिटर्न 1 यदि डाला। 2 यदि पंक्ति अद्यतन किया गया है।

तैयार बयानों के लिए

,

PDOStatement::execute() 

आप कोशिश कर सकते हैं,

PDOStement::rowCount() 
संबंधित मुद्दे