【问题标题】:How to use JavaScript/Ajax and Python to edit local SQL database?如何使用 JavaScript/Ajax 和 Python 编辑本地 SQL 数据库?
【发布时间】:2016-02-10 18:26:25
【问题描述】:

我使用 JavaScript 开发了一个网站的前端。

我有一个按钮,当它被点击时,它会从网站上的另一个对象中检索一个整数值。

我有一个本地 SQL 数据库。单击此按钮时如何进行 SQL 调用?

我已经看到了使用 JavaScript/Ajax 和 PHP 的答案,但我不想使用 PHP。

仅使用 JavaScript,我可以打开本地 SQL 数据库并进行 SQL 调用吗?如果是,怎么做?

如果我不能只使用 JavaScript 来做到这一点,我可以使用 JavaScript/Ajax 和 Python 吗?如果是,请发布参考或简单示例。

【问题讨论】:

    标签: javascript python sql ajax


    【解决方案1】:

    从技术上讲,可以使用客户端 JavaScript 连接到数据库。然而,正如其他人已经指出的那样,这样做被认为是一种非常糟糕的做法,原因有几个——其中最重要的是安全性。

    当要求浏览器加载某个页面时,它会继续向服务器询问在该 URL 中找到的内容。这意味着呈现页面所需的 HTML 文件、外部 JavaScript 文件、图像、样式表和其他资源。由于用户可以访问这些文件,尤其是您的 JavaScript 代码,这意味着他可以访问您的数据库凭据。您可以尝试缩小/混淆代码,但这不会使其更安全。

    如果您确实了解所有后果并且出于某种原因仍想这样做,请查看this example.

    最好的方法是让服务器处理与数据库的交互。根据您选择的语言,您可以使用 PHP(以及诸如 Apache 之类的 HTTP 服务器)、Java、Python 等构建应用程序的该部分。你甚至可以使用 JavaScript(参见 Node.js)。

    由于您要求使用 Python sn-p,因此这里有一个连接到 MySQL 数据库并创建一个 HTTP 服务器来侦听端口 8080 上的连接。对于它将收到的每个 GET 请求,脚本将查询数据库并将结果作为 text/html 发回。

    #!/usr/bin/python
    import MySQLdb
    from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
    
    PORT_NUMBER = 8080
    
    class Handler(BaseHTTPRequestHandler):
    
        def do_GET(self):
    
            # prepare a cursor object using cursor() method
            cursor = db.cursor()
    
            # execute SQL query using execute() method
            cursor.execute("SELECT VERSION()")
    
            # Fetch a single row using fetchone() method
            data = cursor.fetchone()
    
            self.send_response(200)
            self.send_header('Content-type','text/html')
            self.end_headers()
    
            self.wfile.write(data)
            return
    
    try:
    
        db = MySQLdb.connect(host="localhost", user="root", passwd="yourpwd", db="pw_exam")
    
        server = HTTPServer(('', PORT_NUMBER), myHandler)
        print 'Started httpserver on port ' , PORT_NUMBER
    
        server.serve_forever()
    
    except KeyboardInterrupt:
        print '^C received, shutting down the web server'
        server.socket.close()
    

    【讨论】:

      【解决方案2】:

      您不能从浏览器中的 javascript 执行此操作,原因很简单 - 如果您的数据库可用于您的 javascript 代码,那么它也可用于任何网站用户。并且有人会删除您的所有数据或将其替换为有趣的东西。

      这就是为什么我们通常也有服务器端应用程序,它基本上可以是任何语言 - php、python 或 javascript。

      还有一些框架和库可以简化您的工作,也适用于任何语言。

      例如,对于 python,您可以使用 flasksqlalchemy

      如果你想到处使用javascript,那么在服务器上使用nodejsexpressjs 作为服务器端框架是node.js 最流行的选项之一。你也可以找到 node.js 包来对你的数据库进行 SQL 查询。

      您的应用程序的一般流程可能如下所示:

      • 您的客户端应用程序已在浏览器中打开,它需要数据库中的一些数据
      • 向服务器发送 AJAX 请求
      • 服务器发出数据库请求并将数据返回为 json
      • 客户端应用程序显示此数据

      当需要修改数据时,它的工作原理类似。 这里的区别在于您的数据库被服务器端“覆盖”,因此您可以确保只执行允许的操作。 就像没有人能够删除数据库,或者只有注册用户才能编辑配置文件数据(并且只能编辑自己的配置文件数据)等。

      【讨论】:

      • 谢谢。如果我在服务器上有一个数据库,我想使用 JavaScript 在服务器上构建用户界面怎么办?换句话说,我不担心其他人会得到我的 javascript 代码来访问我的数据库。
      • @user3731622 理论上数据库可以公开一些基于 HTTP 的 API,因此可以直接从 javascript 访问它。但实际上我不知道这样做的数据库。如果你不关心 SQL 并且 MongoDB 也可以,你可以试试meteor.js。它仍然有一个服务器端,但它试图隐藏服务器/客户端的差异。查看教程 - meteor.com/tutorials/blaze/creating-an-app。底层的 mongodb 数据库几乎可以从客户端代码直接访问。
      【解决方案3】:

      JQuery 是在网站开发中创建实时数据库提要的绝妙方法。您可以简单地从 CDN 或 Google 导入 JavaScript 文件或在此处下载并使用它:https://jquery.com

      前端:

      $(document).ready(function(){
          $("#idHere").click(function(){
              var testdata = document.getElementByID("#idHere").value;
              var anothertestdata = document.getElementByID("#idHere").value;
              $.ajax({
              url: "/inc/Database.php",
              data: {
              example: testdata,
             anotherexample: anothertestdata
          },
          success: function( data ) {
              $( "#idHere" ).html( "<strong>" + data + "</strong> " );
          }
        });
      });
      });
      

      PHP 文件:

      if(isset($_GET['testdata'])):
          $db = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
          $query = "SELECT * FROM TABLE";
          $result = mysqli_query($db, $query);
          while($row = mysqli_fetch_array($result)):
              echo $row['CollumnName'];
          endwhile;
          $db->close();
      endif;
      

      任何echo'd 都会显示在响应中。

      使用 JavaScript 打开数据库既困难又耗时,并且存在许多安全问题。我不建议这样做。

      【讨论】:

        猜你喜欢
        • 2012-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-04
        • 1970-01-01
        相关资源
        最近更新 更多