JavaScript + PHP 用于在 Wordpress 中访问 MySQL 数据库

Posted

技术标签:

【中文标题】JavaScript + PHP 用于在 Wordpress 中访问 MySQL 数据库【英文标题】:JavaScript + PHP for accessing a MySQL DB in Wordpress 【发布时间】:2013-07-30 15:53:31 【问题描述】:

首先,我要感谢所有 *** 社区的帮助。谢谢!!

正如您在我的first question 上看到的那样,我是使用 Wordpress、javascriptphp 的新手(对于我的工作,我对 SQL 有一些了解),我发现在一些“简单”方面存在一些困难。我一直在寻找这个问题的答案,但我还没有找到,所以如果有人可以为我指出一些方向,我将非常感激。这是交易:

我有一个非常简单的公式,如您所见here,我只想用我自己的 SQL 查询将数据保存在我的 mysql DB 上的表中。它与使用 Wordpress 的数据库相同。我看了很多,找到了一种使用 PHP+Javascript 的“简单”方法。说明非常清楚。

    将此文件 (mysqlwslib.js) 放入您的脚本文件夹中(在我的例子中,我的主题文件夹中的“js”文件夹):

-

var urlMysqlwsphp="../mysqlws.php";
var mysql_db_name ="revistae_wp1";
// ---------------------------------------

// Acceso a mysql
function mysql_use( dbname) 
    mysql_db_name = dbname; 

function mysql_select_query(query) 
    var c="selectQuery";
    var xmlresp = doRequest(c, query);
    return responseContent(xmlresp);

function mysql_update_query(query) 
    var c="updateQuery";
    var xmlresp = doRequest(c, query);
    return responseContent(xmlresp);    

function mysql_col_names(tableName) 
    var c="getColNames";
    var xmlresp = doRequest(c, tableName);
    return responseContent(xmlresp);

// ---------------------------
// Utilidades DOM-html
// ---------------------------
function $(elementId) 
    return document.getElementById(elementId);

function setElementContent( element, content) 
    // Asigna el valor de content a la propiedad
    // innerHTML del element. El element puede ser una
    // referencia o un String con el id
    var domElement=null;
    if(typeof element == 'string') 
        domElement = document.getElementById(element);
    
    if (domElement != null) 
        domElement.innerHTML = content;         
    

function getDocHeight() 
    var D = document;
    return Math.max(
        Math.max(D.body.scrollHeight, D.documentElement.scrollHeight),
        Math.max(D.body.offsetHeight, D.documentElement.offsetHeight),
        Math.max(D.body.clientHeight, D.documentElement.clientHeight)
    );

function setElementHeight(obj, h) 
    if(typeof obj == 'string') 
        obj = $(obj);
       
    obj.style.height = h +'px';

function getElementHeight( obj) 
    var divHeight = 0;
    if(typeof obj == 'string') 
        obj = $(obj);
    
    if(obj.offsetHeight) 
        divHeight=obj.offsetHeight;
     else if(obj.style.pixelHeight)
        divHeight=obj.style.pixelHeight;
    
    return divHeight;

function getWindowHeight() 
    var h = 0;
    if (typeof window.innerWidth != 'undefined') 
        h=window.innerHeight;
     else if (typeof document.documentElement != 'undefined'
            && typeof document.documentElement.clientWidth != 'undefined'
            && document.documentElement.clientWidth != 0) 
        h = document.documentElement.clientHeight;
     else 
        h = document.getElementsByTagName('body')[0].clientHeight;
    
    return h;

function getWindowWidth()   
    var w = 0;
    if (typeof window.innerWidth != 'undefined') 
        w = window.innerWidth;
     else if (typeof document.documentElement != 'undefined'
            && typeof document.documentElement.clientWidth != 'undefined'
            && document.documentElement.clientWidth != 0) 
        w = document.documentElement.clientWidth;
     else 
        w = document.getElementsByTagName('body')[0].clientWidth;
    
    return w;  
  
function getTamanoVentana() 
    var Tamanyo = [ 0, 0 ];
    if (typeof window.innerWidth != 'undefined') 
        Tamanyo = [ window.innerWidth, window.innerHeight ];
     else if (typeof document.documentElement != 'undefined'
            && typeof document.documentElement.clientWidth != 'undefined'
            && document.documentElement.clientWidth != 0) 
        Tamanyo = [ document.documentElement.clientWidth,
                document.documentElement.clientHeight ];
     else 
        Tamanyo = [ document.getElementsByTagName('body')[0].clientWidth,
                document.getElementsByTagName('body')[0].clientHeight ];
    
    return Tamanyo;
  
function createTableFromArray(arrayDatos, arrayCabeceras) 
    // Devuelve una <table>....</table> con los datos del arrayDatos
    // Si se incluye el parametro arrayCabeceras se inserta como fila 1
    // Se puede omitir el parametro arrayCabeceras
    // Devuelve : un String con la <table>...</table>
    var array = arrayDatos;
    if(arrayCabeceras != null) 
        if(arrayCabeceras.length == arrayDatos[0].length) 
            array.unshift(new Array());
            array[0]=arrayCabeceras;
        
    
    // Devuelve un array <table>...</table>
    var cad="";
    if(array == null )
        return cad;
    
    cad ="<table border='1'>";
    var nf, nc;
    if (array[0][0] != null) 
        // Es de dos dimensiones
        nf = array.length;
        nc = array[0].length;
        for(i=0; i< nf;  i++) 
            cad += "<tr>";
            for(j=0; j<nc; j++) 
                cad += "<td>"+array[i][j]+"</td>";
            
            cad += "</tr>";
        
     else if (array[0] != null )
        nf = 1;
        nc = array.length;
        cad += "<tr>";
        for(j=0; j<nc; j++) 
            cad += "<td>"+array[j]+"</td>";
        
        cad += "</tr>";
     else 
        nf = 1;
        nc = 1;
        cad += "<tr>";
        cad += "<td>"+array+"</td>";
        cad += "</tr>";
    
    cad += "</table>";
    return cad;

/*
 * Utilidades de fechas
 */
function parseFechaUTC(cadfecha, cadhora) 
    // Parametros :
    //      cadfecha = "2010-12-21"
    //      cadhora = "12:00:00" (se puede omitir)
    // Devuelve :
    //      objeto Date
    var dt = new Date(); 
    var y = parseInt(cadfecha.substr(0,4));
    var m = parseInt(cadfecha.substr(5,2))-1;
    var d = parseInt(cadfecha.substr(8,2));
    dt.setUTCFullYear(y,m,d);
    var h = 0;
    var min = 0;
    var s = 0;
    if (cadhora != null) 
        h = parseInt(cadhora.substr(0,2));
        min = parseInt(cadhora.substr(3,2));
        s = parseInt(cadhora.substr(6,2));
    
    dt.setUTCHours(h, min, s, 0);
    return dt;

function intToString(number, digits) 
    // Convierte en cadena un numero entero
    // Rellena con ceros a la izda hasta numero de digitos
    var cad = number.toString();
    if(cad.length < digits) 
        var dif = digits - cad.length;
        var ceros ="";
        for (var i=0; i<dif; i++) 
            ceros += "0";
        
        cad = ceros + cad;
    
    return cad;

function getCadFechaUTCFromJSDate(date) 
    var y = date.getUTCFullYear();
    var m = intToString(date.getUTCMonth()+1,2);
    var d = intToString(date.getUTCDate(),2);
    var cad = y +"-"+ m +"-"+ d;
    return cad;

function getCadHoraUTCFromJSDate(date) 
    var h = intToString(date.getUTCHours(),2);
    var m = intToString(date.getUTCMinutes(),2);
    var s = intToString(date.getUTCSeconds(),2);
    var cad = h +":"+ m +":"+ s;
    return cad;

// ----------------------------
// xmlresponse
// ----------------------------
function responseCode(xmlresp) 
    var lstCode = xmlresp.getElementsByTagName("statusCode");
    var cod = lstCode[0].childNodes[0].nodeValue;
    return cod;

function responseText(xmlresp) 
    var lstDesc = xmlresp.getElementsByTagName("statusText");
    var desc = lstDesc[0].childNodes[0].nodeValue;
    return desc;

function responseContent(xmlresp) 
    // Devuelve un array con el contenido.
    // El array puede ser multidimensional
    if(xmlresp == null) 
        return null;
    
    var arResp = new Array();
    var lstCtnt = xmlresp.getElementsByTagName("content");
    var childs = lstCtnt[0].childNodes[0];
    if ((childs != null) && (childs.nodeType == 1)) 
        // Contenido elementos <item>
        var lstItem = lstCtnt[0].getElementsByTagName("item");
        var numItem = lstItem.length;
        for (i = 0; i < numItem; i++) 
            var ar = lstItem[i].childNodes[0].nodeValue.split(",");
            arResp.push(ar);
        
     else if ((childs != null) && (childs.nodeType == 3)) 
        // Contenido una cadena separada por comas
        var ctnt = lstCtnt[0].childNodes[0].nodeValue;
        arResp = ctnt.split(",");
     else 
        arResp = null;
    
    return arResp;

function alertXmlResp(responsexml) 
    var code = responseCode(responsexml);
    var txt = responseText(responsexml);
    var ctnt = responseContent(responsexml);
    alert(code + ", " + txt + "\n" + ctnt);


// ---------------------------------
// AJAX Request
// ---------------------------------
function doRequest(comm, pars) 
    var req = new ajaxRequest();
    if (pars == "") 
        pars = "1";
    
    var url = urlMysqlwsphp+"?db="+mysql_db_name+"&c=" + comm + "&p=" + pars;
    req.open("GET", url, false);
    req.send(null);
    return req.responseXML;

function loadXmlDoc(name) 
    var req = new ajaxRequest();
    req.open("GET", name, false);
    req.send(null);
    return req.responseXML;

function loadXMLString(txt) 
    if (window.DOMParser) 
        parser = new DOMParser();
        xmlDoc = parser.parseFromString(txt, "text/xml");
     else  // Internet Explorer
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = "false";
        xmlDoc.loadXML(txt);
    
    return xmlDoc;

function ajaxRequest() 
    try 
        var request = new XMLHttpRequest();
     catch (e1) 
        try 
            request = new ActiveXObject("Msxml2.XMLHTTP");
         catch (e2) 
            try 
                request = new ActiveXObject("Microsoft.XMLHTTP");
             catch (e3) 
                request = false;
            
        
    
    return request;

2 把这个PHP文件(mysqlws.php)放在父文件夹中(注意它在上一个文件中也有引用,这个文件的连接数据是从我的wp-config.php文件中提取的,因为目标表在相同的数据库):

<?php
header('Content-Type: text/xml');
header("Cache-Control: no-store, no-cache, must-revalidate");

// Los valores $host, $user, $pw, $db se deben de adaptar a cada instalación
$host="localhost";
$user=*MyUser*;
$pw=*MyPass*;
// Indicar el nombre de una base de datos que se abrirá por defecto
$db=*MyDBName*;


if(isset($_GET['c']) and isset($_GET['p'])) 
    $command=$_GET['c'];
    $params = $_GET['p'];
    if(isset($_GET['db'])) 
        $db = $_GET['db'];
    
    $resp = processcommand($command, $params);
 else 
    $resp=createResponse(0, "ERROR", "Parametros HTTPGET incorrectos");

echo $resp;
return;

function processCommand($command, $params) 
    // processCommand
    // procesa un comando válido recibido en la llamada a la página. 
    // Es llamado desde el flujo principal
    // Distribuye el trabajo a la rutina correspondiente y
    // devuelve una respuesta en formato xml

    // Declarar la respuesta
    $respxml=null;

    // Derivar a la rutina adecuada
    if(strcmp("updateQuery",$command)== 0) 
        $respxml=updateQuery($params);
     else if (strcmp("selectQuery",$command)==0) 
        $respxml=selectQuery($params); 
     else if (strcmp("getColNames",$command)==0) 
        $respxml=getColNames($params); 
     else 
        $respxml=createResponse(0,"ERROR","El comando no existe");
    

    return $respxml;



function updateQuery($query) 
// Ejecuta un comando tipo UPDATE, INSERT, DELETE,... en la base de datos
// $query = String con el comando   
// devuelve: xmlresponse con el resultado

    GLOBAL $host, $user, $pw, $db;

    // Abrir la conexión con mysql
    $conn = opendb($host, $user, $pw, $db);
    if(!$conn) 
        return createResponse(-2,"ERROR","Error de conexión.-$conn");
    


    // Realizar la consulta a la B.D.
    $result=mysql_query($query, $conn);

    $ar = mysql_affected_rows();

    $cod = 0;
    $text ="ERROR";
    $desc ="-1";

    if($result == true) 
        $cod = 0;
        $text ="OK";
        $desc =$ar; 
    
    $response = createResponse($cod,$text,$desc);

    // Cerrar la conexión
    closedb($conn);

    // Devolver el resultado
    return $response;
;

function selectQuery($query) 
// Ejecuta un comando tipo SELECT en la base de datos
// query = String con el comando    
// devuelve: xmlresponse con el resultado

    GLOBAL $host, $user, $pw, $db;

    // Abrir la conexión con mysql
    $conn = opendb($host, $user, $pw, $db);
    if(!$conn) 
        return createResponse(-2,"ERROR","Error de conexión.-$conn");
    

    // Realizar la consulta a la B.D.
    $result=mysql_query($query, $conn);

    if ($result) 
        $nc = mysql_num_fields($result);

        $cad="";
        while( $row = mysql_fetch_array($result, MYSQL_BOTH)) 
            $cad .="<item>";
            for($i=0; $i<$nc; $i++) 
                $cad .= $row[$i];
                if($i<$nc-1) 
                    $cad .= ",";
                
            
            $cad .= "</item>";
        

        mysql_free_result($result);

        $response = createResponse(1, "OK", $cad);
     else 
        $response = createResponse(0, "ERROR", "Error en la llamada SQL"); 
    
    // Cerrar la conexión
    closedb($conn);

    // Devolver el resultado
    return $response;
;

function getColNames($nombreTabla) 
    // Devuelve un array con los nombres de las columnas de la 
    // tabla pasada como argumento
    // Si error devuelve array nulo;    

    // Establecer las variables globales
    GLOBAL $host, $user, $pw, $db;

    // Abrir la conexión con mysql
    $conn = opendb($host, $user, $pw, $db);
    if(!$conn) 
        return createResponse(-2,"ERROR","Error de conexión.-$conn");
    

    // Realizar la consulta a la B.D.
    $query = "SELECT * FROM $nombreTabla";
    $result=mysql_query($query, $conn);
    if ($result) 

        $numcols = mysql_num_fields($result);

        $resp = "";
        for($i=0; $i< $numcols; $i++) 
            $resp .= mysql_field_name($result, $i);
            if($i < $numcols-1) 
                $resp .= ",";
               
        
        mysql_free_result($result);
        $response = createResponse(1, "OK", $resp);

     else 
        $response = createResponse(0, "ERROR", "Error en acceso SQL");

    


    // Cerrar la conexión
    closedb($conn);

    // Devolver el resultado
    return $response;
;

function opendb($host, $user, $pw, $db) 
    // opendb
    // Establece conexión con el servidor $host y hace un USE de la base de datos $db
    // Parametros:
    //    $host
    //    $user
    //    $pw : password
    //    $db : Base de datos sobre la que se hará el USE 
    // Devuelve:
    //    Referencia a la conexión abierta o null si hay errores
    //
    $conn = mysql_connect($host, $user, $pw);
    if(!$conn) 
        return null;
    
    //echo "connected<br/>";
    $resp = mysql_select_db($db, $conn);
    if($resp != true) 
        return null;
    
    //echo "used<br/>";
    return $conn;
;

function closedb($conn) 
    // closedb()
    // Cierra la conexión con la base de datos
    // Parámetros:
    //     $conn Referencia al recurso de la conexión con la B.D.
    // Devuelve
    //     void
    if(!$conn) 
        return;
    
    mysql_close($conn);
;

function createArrayFromCadParams($cadParams) 
    // Recibe como entrada la cadena de parametros separados por comas
    // y devuelve un Array con los parametros separados
    $arrayParams=array();
    if (strlen($cadParams)!=0) 
        if(strpos($cadParams, ',')>0) 
            $arrayParams =  explode(',',$cadParams);
         else 
            $arrayParams[0]=$cadParams;
        
    
    return $arrayParams;
;

function createResponse($code, $text, $content) 
    // createResponse($code, $descrip, $content)
    //      Genera un documento XML del tipo <regataResponse>.
    //      (Ver su constitución en la documentación del programa)
    // Parámetros:
    //
    // Devuelve:
    //
    $doc=new DOMDocument('1.0');
    $cadxml="<wsResponse>";
    $cadxml=$cadxml."<statusCode>$code</statusCode>";
    $cadxml=$cadxml."<statusText>$text</statusText>";
    $cadxml=$cadxml."<content>$content</content>";
    $cadxml=$cadxml."</wsResponse>";
    $doc->loadXML($cadxml);
    return $doc->saveXML();
;

function createResponseFromCode($code) 
    // createResponseFromCode($code)
    //      Genera un documento XML del tipo <wsResponse>.
    //      OK para códigos >0 y ERROR para codigos <= 0        
    // (Ver su constitución en la documentación del programa)
    // Parámetros:
    //
    // Devuelve:
    //
    $text="ERROR";
    $content = "ERROR";
    if($code>0) 
        $text="OK";
        $content ="OK";
    
    $doc=new DOMDocument('1.0');
    $cadxml="<wsResponse>";
    $cadxml=$cadxml."<statusCode>$code</statusCode>";
    $cadxml=$cadxml."<statusText>$text</statusText>";
    $cadxml=$cadxml."<content>$content</content>";
    $cadxml=$cadxml."</wsResponse>";
    $doc->loadXML($cadxml);
    return $doc->saveXML();
;
?>

3 并引用头文件中的脚本: [...]

<script src="mysqlws.js"></script>

[...]

然后我尝试在另一个 js 文件中实现我的代码,其中我有公式的所有逻辑:

[...]

function liberar()
  
    var SQLguardar = null;
    var fecha = new Date();
    var indice = null;
    //Compruebo si existe dirección en el formulario
    //Esto es necesario porque si no han introducido una no se cambiarán las coordenadas.
    if(document.getElementById("direccion").value !='')
    

        txtDireccion = document.getElementById("direccion").value;
        txtObservaciones = document.getElementById("observaciones").value;
        txtNumRev = document.getElementById("numerorevista").value;
        txtLat = document.getElementById("lat").value;
        txtLng = document.getElementById("long").value;

        //alert ("Comenzando Guardado. Datos: "+txtDireccion+", "+txtObservaciones+", "+txtNumRev+", "+txtLat+", "+txtLng+".");

        //Definimos la consulta que guardará el nuevo punto

        SQLguardar = "INSERT INTO wp_leafletmapsmarker_markers (markername, basemap, layer, lat, lon, icon, popuptext, zoom, openpopup, mapwidth, mapwidthunit, mapheight, panel, createdby, createdon, updatedby, updatedon, controlbox, overlays_custom, overlays_custom2, overlays_custom3, overlays_custom4, wms, wms2, wms3, wms4, wms5, wms6, wms7, wms8, wms9, wms10, kml_timestamp, address) VALUES ('Ecléctica nº "+ txtNumRev+"', 'osm_mapnik', 3, "+ txtLat +", "+ txtLng+", 'text.png', '"+txtObservaciones+"', 17, 0, 640, 'px', 480, 0, 'revista','"+ fecha.getFullYear()+"/"+fecha.getMonth()+"/"+fecha.getDate()+"', NULL, NULL, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, '"+txtDireccion+"');";

        mysql_use("localhost",*MyDBUser*,*MyDBPass*,*MyDBName*);

        var arrayResult = mysql_update_query(SQLguardar);

        alert ("Resultado: "+arrayResult[0]);   

    else alert ("ATENCION: No se ha introducido una Direcci"+'\u00f3'+"n.  Por favor introduzca una direcci"+'\u00f3'+"n, pulse 'Pasar al mapa' y afine la localizaci"+'\u00f3'+"n con el marcador");

  

我的问题是它不保存任何东西。当我按下按钮(Liberar !!!)时,公式会以正确的 PHP 方向重新加载,但在数据库中我找不到新行。此外,必须显示结果的最后一个“警报”永远不会弹出......您可以看到公式here。我知道执行会到达这个方法,因为如果第一个警报未注释它会显示变量,但是当它尝试执行查询时,页面会重新加载并且什么都没有保存......

请有人指出我的错误吗?如何查看结果消息?还有其他方法可以使用您自己的 SQL 查询吗?此公式是项目的一部分,我需要使用自己的 SQL 查询来访问、处理和保存数据。

非常感谢您的时间和帮助。

【问题讨论】:

【参考方案1】:

您不应在 JS 文件中构建 SQL 查询。 那应该在您的 PHP 文件中。从您的 JS 调用您的 PHP 文件,然后从您的 PHP 文件调用 SQL 服务器。 这对安全性更好,并且您更容易调试。

先尝试一下,然后检查您的日志是否有任何语法错误。

如果您选择忽略此建议(我强烈建议您不要这样做),您可以通过查看浏览器的控制台来进一步调试。

要在 php 中调试它,首先启用 error_reporting 以捕获任何不需要的语法错误并尝试以下几行:

$mysqli = new mysqli("example.com", "user", "password", "database");

/* check connection */
if ($mysqli->connect_errno) 
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();


if (!$mysqli->query($query)) 
    printf("Errormessage: %s\n", $mysqli->error);


/* close connection */
$mysqli->close();

记得在一切顺利后关闭 error_reporting。

【讨论】:

好的,我会尝试将查询移动到 php 文件中。这将如何帮助我进行调试?我的意思是,如果我犯了错误,它会在哪里显示?非常感谢 您可以轻松访问php文件并在每次访问时手动触发SQL查询。如果你有 error_reporting ON 你会直接在屏幕上打印错误。

以上是关于JavaScript + PHP 用于在 Wordpress 中访问 MySQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

在 php 中使用 edraw 保存 ms word docx 文件

是否在Office API或Word javaScript API的JavaScript API中公开了自动更正?

JavaScript + PHP 用于在 Wordpress 中访问 MySQL 数据库

初探JavaScript PDF blob转换为Word docx方法

用于 HTML、PHP 和 JavaScript 的 Pygments 样式

用于 Web 开发和设计的有用 Vim 插件(php、html、css、javascript)? [关闭]