当前位置: 首页 > 知识库问答 >
问题:

使用PHP表单将WKT和SRID中的几何体插入SQL Server 2017

壤驷深
2023-03-14

我有一个PHP7.3表单,要求用户输入名称、WKT和SRID。我想将WKT和SRID上传到SQL Server 2017,以便它在upload_WKT_测试中使用STGeomFromText创建一个几何对象:

<?php
    if ($_SERVER['REQUEST_METHOD']=="POST") {
        $wkt = $_POST['wkt'];
        $srid = $_POST['srid'];
        $name = $_POST['name'];
        try {
            $wktQuoted = $pdo->quote ($wkt);
            //$wktQuoted = "'$wkt'";
            $sql = "INSERT INTO Upload_WKT_Test (Name, GeomCol1) VALUES (:name, :wktGeom)";
            $wktGeom1 = "geometry::STGeomFromText(";
            $wktGeom = $wktGeom1."".$wktQuoted.", ".$srid.")";
            //echo $wktGeom."<br><br>".$name."<br><br>";
            $stmnt = $pdo->prepare($sql);
            $theData = [':name'=>$name, ':wktGeom'=>$wktGeom];
            $stmnt->execute($theData);
        } catch(PDOException $e) {
            echo "Error: ".$e->getMessage();
        }
    } else {
        $wkt="";
        $alignment="";
        $srid="";
    }
?>

我的名字。php:

<?php
    ob_start();
    session_start();
     try {
        $pdo = new PDO( "sqlsrv:Server=localhost\SQLEXPRESS;Database=devdb", "", "");
        $pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
        $pdo->setAttribute( PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC );
        //$pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES, true );
    }

    catch( PDOException $e ) {  
        //die( "Error connecting to SQL Server" );
        //die(print_r($stmnt->errorInfo(), true));
        echo "Error: ".$e->getMessage();
    }  
    $root_directory = "testwkt";
    $from_email = "admin@somewhere.com";
    $reply_email = "admin@somewhere.com";
    include "php_functions.php";
?>

我知道通过表单接受用户输入的首选方法是使用参数化查询来防止SQL注入。我相信错误消息的来源与WKT周围的引用有关,因为它们没有进入INSERT into语句。是否可以用引号(WKT)包围输入表单中的文本值,并使用它构建几何体对象?

示例WKT进入表格点(100 10)

示例SRID0

示例名称Test

WKT的几何图形(需要引用):

geometry::STPointFromText('POINT (100 10)', 0)

产生的错误消息:

SQLSTATE[42000]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]
A .NET Framework error occurred during execution of user-defined routine or
aggregate "geometry": System.FormatException: 24114: The label
geometry::STGeomFrom in the input well-known text (WKT) is not valid. 
Valid labels are POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING,
MULTIPOLYGON, GEOMETRYCOLLECTION, CIRCULARSTRING, COMPOUNDCURVE, 
CURVEPOLYGON and FULLGLOBE (geography Data Type only). 
System.FormatException: at
Microsoft.SqlServer.Types.OpenGisTypes.ParseLabel(String input) at
Microsoft.SqlServer.Types.WellKnownTextReader.ParseTaggedText(OpenGisType type) at 
Microsoft.SqlServer.Types.WellKnownTextReader.Read(OpenGisType type, Int32 srid) at 
Microsoft.SqlServer.Types.SqlGeometry.GeometryFromText(OpenGisType type, SqlChars text, Int32 srid) at
Microsoft.SqlServer.Types.SqlGeometry.Parse(SqlString s) .

上传WKT测试表:

CREATE TABLE dbo.Upload_WKT_Test
    ( id int IDENTITY (1,1),
    Name varchar(50),
    GeomCol1 geometry );
GO

WKT-众所周知的文本-一种以文本格式表示几何对象(例如点、线、多边形)的方法。更多信息请点击这里。

SRID—空间参考系标识符—表示坐标系的整数。更多信息请点击这里。

有关在SQL服务器和AzureSQL数据库中使用几何实例的详细信息,请参阅此处。

更多关于STGeomFromText的信息

共有1个答案

法和硕
2023-03-14

您应该在T-SQL语句中包含geometry::stgeomefromtext,并在不使用PDO::quote的情况下绑定$wkt参数的值:

<?php
    if ($_SERVER['REQUEST_METHOD']=="POST") {
        $wkt = $_POST['wkt'];
        $srid = $_POST['srid'];
        $name = $_POST['name'];
        try {
            $sql = "
               INSERT INTO Upload_WKT_Test (Name, GeomCol1) 
               VALUES (:name, geometry::STGeomFromText(:wkt, :srid))";
            $stmnt = $pdo->prepare($sql);
            $theData = [':name'=>$name, ':wkt'=>$wkt, ':srid'=>$srid];
            $stmnt->execute($theData);
        } catch(PDOException $e) {
            echo "Error: ".$e->getMessage();
        }
    } else {
        $wkt="";
        $alignment="";
        $srid="";
    }
?>
 类似资料:
  • 我有一个postgres表,它正在使用

  • 问题内容: 我从终端创建了一个表,然后尝试创建简单的任务:从表单中插入值。这是我的 这是我的。 按下我的保存按钮后,什么也没有发生,数据库仍然为空。我尝试了查询,它按照预期的方式从表单中获取所有值。在尝试从终端检查是否可以正常工作后,我登录到尝试从users表返回所有数据的操作,但得到了空集。 问题答案: 以下代码仅声明了一个包含MySQL查询的字符串变量: 它不执行查询。为此,您需要使用一些功能

  • 前面课程绘制了一个立方体效果,下面通过three.js的球体构造函数SphereGeometry()在三维场景中添加一个球几何体。 SphereGeometry构造函数 SphereGeometry(radius, widthSegments, heightSegments) 第一个参数radius约束的是球的大小,参数widthSegments、heightSegments约束的是球面的精度,

  • 问题内容: 我开发了一种将许多东西插入数据库的表单。但是以某种方式,当页面被填满时,它也只插入数据库管理员的user_password。我该如何解决这个问题? 问题答案: 您忘记输入关键字“ VALUES”。检查INSERT INTO的语法。 您传递给MySQL的变量(“ $ name”,“ $ password”,“ $ email”,“ $ contact”,“ $ age”,“ $ gend

  • 我正在尝试使用PHP从HTML表单中插入数据到数据库中。我做了两个文件html表单和其他是PHP脚本。当我单击以html表单提交时,它显示给我php代码。我正在使用wamp服务器作为数据库。我将html文件放在C:/wamp64/www目录中,html文件放在本地目录中。数据库表为:id int(11)fname varchar(30)salary int(11)。Id不是自动递增的,它是主键。

  • 我正在创建一个使用Apache Web服务器(PHPmyAdmin)的PHP网站 我有三张桌子: 品牌 brand_id(主键)自动增加 brand_name < li>item_id(主键)自动递增 < li >项目类别 model_id(主键)自动增加 item_model brand_id(brand.brand_id的外键) brand_name(item.item_id的外键) 数量 价