2014-03-30 67 views
0

我必須做一些錯誤的代碼MySQL的存儲過程....運行從PHP

<? 
$codeid=$_GET["codeid"]; 
$tablecode=$_GET["tablecode"]; 
$description=$_GET["description"]; 
$code=$_GET["code"]; 
$groupcode=$_GET["groupcode"]; 
$t1=$_GET["t1"]; 
$t2=$_GET["t2"]; 
$t3=$_GET["t3"]; 

$mysqli = new mysqli(dbhost,dbuser,dbpass,dbc); 
if ($mysqli->connect_error) { 
    die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error); 
    } 

$q="call spUpdateCodeTable(?,?,?,?,?,?,?,?)"; 
$stmt = $mysqli->prepare($q); 
$stmt->bind_param($codeid,$tablecode,$description,$code,$groupcode,$t1,$t2,$t3); 
$stmt->execute(); 

mysql_close($mysqli); 
?> 

絕對沒有任何反應......沒有錯誤信息或問題的任何其他指示。它只是不運行該過程。 (這是一個更新/插入例程)。

我使用這個網址...

updateCodeTable.php?codeid=0&codetable=TABLE&desription=testing2%20entry&code=TEST1&groupcode=gcode&t1=t1&t2=t2&t3=t3 

...但是,如果我運行在phpMyAdmin的這個查詢,它運行完美....

call spUpdateCodeTable(0,'TABLE','testing2','TEST1','group','','',''); 

我可以包括存儲過程代碼,但它運行正常,我直接運行它,但只是沒有成功從我的PHP代碼運行。

+0

用'mysqli_report(MYSQLI_REPORT_STRICT)再次嘗試; $ q =「...' - 讓錯過sql錯誤變得更加困難。參見http://docs.php.net/mysqli-driver.report-mode – VolkerK

+0

我可以問一下,爲什麼你要使用一個過程? –

+0

因爲我我是一個很長時間的ms-SQL服務器人員,存儲過程可以處理所有的事情,我仍然認爲儘可能在服務器上完成的處理應該是很多的,但是PHP和MySQL是新的,所以誰知道我會怎麼想一年之後 –

回答

0

每個mysqli *函數/方法都可能失敗。無論是測試返回值和/或切換報告機制異常,看http://docs.php.net/mysqli-driver.report-mode

<?php 
// probably better done with http://docs.php.net/filter but anyway ...just check whether all those parameters are really there 
// you are positive that GET is the correct method for this action? 
if (!isset($_GET["codeid"], $_GET["tablecode"], $_GET["description"], $_GET["code"], $_GET["groupcode"], $_GET["t1"], $_GET["t2"], $_GET["t3"])) { 
    // die() is such a crude method 
    // but bare me, it's just an example.... 
    // see e.g. http://docs.php.net/trigger_error 
    die('missing parameter'); 
} 
else { 
    $mysqli = new mysqli(dbhost,dbuser,dbpass,dbc); 
    if ($mysqli->connect_error) { 
     die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error); 
    } 

    $q="call spUpdateCodeTable(?,?,?,?,?,?,?,?)"; 
    $stmt = $mysqli->prepare($q); 
    if (!$stmt) { 
     // $mysqli->error has more info 
     die('prepare failed'); 
    } 
    // you have to provide the format of each parameter in the first parameter to bind_param 
    // I just set them all to strings, better check that 
    if (!$stmt->bind_param('ssssssss', $_GET['codeid'], $_GET['tablecode'], $_GET['description'], $_GET['code'], $_GET['groupcode'], $_GET['t1'], $_GET['t2'], $_GET['t3'])) { 
     // $stmt->error has more info 
     die('bind failed'); 
    } 

    if (!$stmt->execute()) { 
     // $stmt->error has more info 
     die('execute failed'); 
    } 
} 
+0

Don你覺得它太過分了嗎? –

+0

您的常識:我有一個'非常過分'的預感,你不是指代碼的質量;-),而是「做他人的工作」部分。坦率地說,我已經放棄了提及良好的實踐,希望每個人都能廣泛地學習,從不發生。所以我只是滿足於mabye,也許只是在某些方面提高了基準,並且不會讓太多人拿出_awfully_本地化的答案,但仍然不知道腳本中存在大量的_fundamental_缺陷。希望那裏有一個「閱讀後燃燒」的問題和答案投票。我會標記我的大部分答案。 – VolkerK

+0

非常感謝。我會做更多的調查返回錯誤信息。 –

-1

可以試試看嗎?

mysqli->query("call spUpdateCodeTable($codeid,'$tablecode', 
'$description','$code','$groupcode','$t1','$t2','$t3')"); 
+1

這會損害使用準備好的語句的全部目的 – casperw

+0

Amit:是的,這就是我以前做過的事情,但我正在學習使用準備好的語句,我甚至不能告訴你現在使用它們的好處除了我已經閱讀過,現在似乎是首選,但在這種情況下,問題是一個錯字而不是邏輯。 –

+0

......我應該說,問題是一個錯字並且我缺少錯誤檢查。 –