2009-07-04 9 views
3

Ich benutze native MySQL-Treiber (http://code.google.com/p/erlang-mysql-driver/) mit mochiweb. Als ich diesen MySQL-Treiber im Shell-Modus ausprobierte, ging alles gut. Aber wenn ich einen Code mit Mochiweb schreiben, berichtet mir folgende Fehlermeldung:Verwenden von nativen MySQL-Treiber in Erlang

=CRASH REPORT==== 4-Jul-2009::04:44:29 === 
    crasher: 
    initial call: mochiweb_socket_server:acceptor_loop/1 
    pid: <0.61.0> 
    registered_name: [] 
    exception error: no function clause matching 
        mysql:fetch(p1,<<"SELECT * FROM cdb_forums LIMIT 10">>) 
     in function perly_web:loop/2 
     in call from mochiweb_http:headers/5 
    ancestors: [perly_web,perly_sup,<0.58.0>] 
    messages: [] 
    links: [<0.60.0>,#Port<0.965>] 
    dictionary: [{mochiweb_request_body,undefined}, 
        {mochiweb_request_qs,[]}, 
        {mochiweb_request_post,[]}, 
        {mochiweb_request_path,"/online"}, 
        {mochiweb_request_cookie, 
         [{"04c_sid","hG9Oyv"}, 
         {"04c_visitedfid","2"}, 
         {"kQx_cookietime","2592000"}, 
         {"kQx_loginuser","admin"}, 
         {"kQx_activationauth", 
         "98b3mdX86fKT9dI4WyKuL61Tqxk%2BW1r6ACpHp9y8itH2xQ"}, 
         {"smile","1D1"}]}] 
    trap_exit: false 
    status: running 
    heap_size: 1597 
    stack_size: 24 
    reductions: 5188 
    neighbours: 

Der Code, den ich in Mochiweb schreiben ist

start(Options) -> 
    {DocRoot, Options1} = get_option(docroot, Options), 
    Loop = fun (Req) -> 
        ?MODULE:loop(Req, DocRoot) 
      end, 
    % we’ll set our maximum to 1 million connections. (default: 2048) 
    mochiweb_http:start([{max, 1000000}, {name, ?MODULE}, {loop, Loop} | Options1]), 
    mysql:start_link(p1, "10.0.0.123", "root", "root", "test"). 

stop() -> 
    mochiweb_http:stop(?MODULE). 

loop(Req, DocRoot) -> 
    "/" ++ Path = Req:get(path), 
    case Req:get(method) of 
     Method when Method =:= 'GET'; Method =:= 'HEAD' -> 
      case Path of 
       "online" -> 
        Result1 = mysql:fetch(p1, <<"SELECT * FROM cdb_forums LIMIT 10">>), 
        Body1 = io:format("Result1: ~p~n", [Result1]), 
        Req:ok({"text/plain", Body1}); 

Die Verbindung sieht gut aus, aber wenn ich hinzugefügt

Result1 = mysql:fetch(p1, <<"SELECT * FROM cdb_forums LIMIT 10">>),

es stürzte ab.

Kann mir jemand helfen? Vielen Dank im Voraus ~

// ======================================== ========== aktualisiert:

Ich bemerkte die folgenden Informationen. Wenn das stimmt?

=PROGRESS REPORT==== 4-Jul-2009::05:49:32 === 
      supervisor: {local,kernel_safe_sup} 
      started: [{pid,<0.65.0>}, 
         {name,inet_gethost_native_sup}, 
         {mfa,{inet_gethost_native,start_link,[]}}, 
         {restart_type,temporary}, 
         {shutdown,1000}, 
         {child_type,worker}] 
mysql_conn: greeting version "5.1.33-log" (protocol 10) salt "ne0_m'vA" caps 63487 serverchar <<8,2,0,0, 
                           0,0,0,0, 
                           0,0,0,0, 
                           0,0,0,0>> salt2 "!|o;vabJ*4bt" 
mysql_auth send packet 1: <<5,162,0,0,64,66,15,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 
          0,0,0,0,0,0,0,0,0,114,111,111,116,0,20,52,235,78, 
          173,36,251,201,242,172,139,113,231,253,181,245,3, 
          91,198,111,135>> 
Link: {ok,<0.62.0>} 

=SUPERVISOR REPORT==== 4-Jul-2009::05:49:32 === 
    Supervisor: {local,perly_sup} 
    Context: start_error 
    Reason:  ok 
    Offender: [{pid,undefined}, 
        {name,perly_web}, 
        {mfa, 
         {perly_web,start, 
          [[{ip,"0.0.0.0"}, 
          {port,8000}, 
          {docroot, 
           "/work/mochiweb-read-only/scripts/perly/priv/www"}]]}}, 
        {restart_type,permanent}, 
        {shutdown,5000}, 
        {child_type,worker}] 

Antwort

5

Der tatsächliche Fehler ist hier:

no function clause matching 
mysql:fetch(p1,<<"SELECT * FROM cdb_forums LIMIT 10">>) 

Dieser Fehler bedeutet, die Funktion ist und exportiert, aber ersetzt nicht die Art von Argument Sie vorbei an den MySQL-Treiber-Code sagt. dass mysql:fetch/2 ein dauert - Sie haben es eine binäre übergeben, die keine gültige ist. Doing:

mysql:fetch(p1,[<<"SELECT * FROM cdb_forums LIMIT 10">>]) 
%% or 
mysql:fetch(p1,"SELECT * FROM cdb_forums LIMIT 10") 

sollte stattdessen funktionieren, da diese valide iolists sind.

+0

Vielen Dank für Ihre Antwort –

1

Ich finde, dass der Stern ein Problem verursacht. Das explizite Auswählen eines Felds hilft.