连接失败: SQLState:'01000' SQL Server 错误: 53 [Microsoft][ODBC SQL Server Driver][DBNETLIB]Connec

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了连接失败: SQLState:'01000' SQL Server 错误: 53 [Microsoft][ODBC SQL Server Driver][DBNETLIB]Connec相关的知识,希望对你有一定的参考价值。

连接失败:
SQLState:'08001'
SQL Server 错误: 17
[Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server 不存在或访问被拒绝

连接失败: SQLState:'01000' SQL Server 错误: 53 [Microsoft][ODBC SQL Server Driver][DBNETLIB]Connect是设置错误造成的,解决方法为:

1、以windows验证模式进入数据库管理器。

2、windows身份登录后,找到:安全性->登录名->sa,然后右击选择属性。

3、选择常规(输入新的密码,取消实施密码策略)。

4、选择状态(设置授予和启用)。

5、右击选择属性。

6、选择安全性(SQL Server 和windows身份验证模式)。

7、然后点击确定按钮。

参考技术A 最近有没有更改了服务器的计算机名?如果有的话改回原来的。点“开始”--“运行”,输入“regedit” 打开注册表,找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 项,删除其中的“PendingFileRenameOperations”。看看服务器的DNS有没有变动,也就是ping计算机名时找不到SQL服务器,解决这个问题的办法也可以修改hosts文件,增加一条记录。检查tcp/ip协议 -> 属性 -> 高级 -> 选项 -> 属性 -> 关闭 tcp/ip筛选。启动sqlserver agent的服务,并将其改为自动启动。本回答被提问者采纳 参考技术B 1:去掉本系统的防火墙和其它一切防火墙。
2:在客户端执行 telnet 服务器ip 1433,如果提示错误,则sql的缺省端口被禁止-此步骤可忽略
3:查看服务器的安全策略,打开即可。
管理工具-本地的安去策略-ip安全策略-双击新ip安全策略-规则-1433-筛选器操作-允许。即可
参考技术C 一般来说,要查如下步骤:
1. 确认数据库是否允许远程连接
2. 确认数据库服务是否正常启动
3. 确认数据库服务器的防火墙开通
4. 确认客户端到服务器网络畅通
5. 确认连接字符串正确,包括:主机名\实例名,端口
6. 确认数据库是否允许混合登录方式
参考技术D 缺少ODBC 驱动。。

连接失败:SQLSTATE [42000]:语法错误或访问冲突:1064

我已经看到很多类似于我的问题,但是我的不一样:我的错误不是因为在SQL中使用"keyword"引起的!

当我运行我的代码,如果我取消WHERE子句或我使用硬编码值,如" WHERE customerNumber = 356"它工作正常,但如果我尝试使用变量$custom_n的值,它会抛出一个错误。

<?php 
            $custom_n = $_POST["emp"];
            $servername = "localhost";
            $username = "root";
            $password = "";

            try {
                $conn = new PDO("mysql:host=$servername;dbname=classicmodels", $username, $password);
                $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                $stmt = $conn -> prepare("SELECT phone, salesRepEmployeeNumber, creditLimit FROM customers WHERE customerNumber = $custom_n");
                $stmt -> execute();
                $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); 
                foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) { 
                    echo $v;
                }
            }
            catch(PDOException $e) {
                echo "Connection failed: " . $e->getMessage();
            }

            $conn = null;

        ?>

如果我对custom_n和gettype做一个回音我得到:353字符串这是我想要的。

这是完整的错误:

连接失败:SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;检查与您的MariaDB服务器版本对应的手册,以便在第1行的''附近使用正确的语法

正如Magnus Eriksson所建议的,如果我做一个var_dump($custom_n);我得到这个输出:string(12) ""

答案
$stmt = $conn -> prepare("SELECT phone, salesRepEmployeeNumber, creditLimit FROM customers WHERE customerNumber = ?");
$stmt->execute(array($custom_n));

你的代码看起来很好,所以我假设你的字符串转义查询。下次尝试使用预备语句。

另一答案

正如Magnus Eriksson所建议的那样,我的POST方法存在问题......即使它似乎没问题,我的变量custom_n也有一个奇怪的var_dump输出string(12)""。我记得我以前使用过相同的代码而且工作正常,所以我只是修改代码完全相同:在我有发送“POST变量”的表单的页面中,我使用了这段代码:

<?php 

            $servername = "localhost";
            $username = "root";
            $password = "";

            $custom_n = array();

            try {
                $conn = new PDO("mysql:host=$servername;dbname=classicmodels", $username, $password);
                $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                $stmt = $conn -> prepare("SELECT checkNumber, paymentDate, amount, customerNumber FROM payments ORDER BY paymentDate DESC");
                $stmt -> execute();
                $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); 
                foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) { 
                    echo $v;
                    if ($k == 'customerNumber') {
                        array_push($custom_n, $v);
                    }
                }

                $tableCodes = "<table id='buttons'>";
                foreach ($custom_n as $c) {
                    $tableCodes .= "
                        <tr>
                            <td>
                                <form action='customers.php' method='post' target='POPUPW' onsubmit="POPUPW = window.open('about:blank','POPUPW', 'width=800px,height=600px');">
                                    <button type='submit' name='code' value='$c'>Details</button>
                                </form>
                            </td>
                        </tr>
                    ";
                }
                $tableCodes .= "</table>";
                echo $tableCodes;
            }
            catch(PDOException $e) {
                echo "Connection failed: " . $e->getMessage();
            }

            $conn = null;

        ?>

我以为我可以节省一些时间从另一个查询获取custom_n,我在该页面中填充表而不是进行另一个查询。我不确定这有什么问题,但随着这种变化,我解决了这个问题:

<?php 

            $servername = "localhost";
            $username = "root";
            $password = "";

            try {
                $conn = new PDO("mysql:host=$servername;dbname=classicmodels", $username, $password);
                $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                $stmt = $conn -> prepare("SELECT checkNumber, paymentDate, amount, customerNumber FROM payments ORDER BY paymentDate DESC");
                $stmt -> execute();
                $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); 
                foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) { 
                    echo $v; 
                }

                $customQuery = $conn -> prepare("SELECT customerNumber FROM payments ORDER BY paymentDate DESC");
                $customQuery -> execute();
                $custom = $customQuery->fetchAll(PDO::FETCH_COLUMN);
                $tableCodes = "<table id='buttons'>";
                foreach ($custom as $c) {
                    $tableCodes .= "
                        <tr>
                            <td>
                                <form action='customers.php' method='post' target='POPUPW' onsubmit="POPUPW = window.open('about:blank','POPUPW', 'width=800px,height=600px');">
                                    <button type='submit' name='emp' value='$c'>Details</button>
                                </form>
                            </td>
                        </tr>
                    ";
                }
                $tableCodes .= "</table>";
                echo $tableCodes;
            }
            catch(PDOException $e) {
                echo "Connection failed: " . $e->getMessage();
            }

            $conn = null;

        ?>

我要感谢大家,特别是MagnusEriksson,MasivuyeCokile和Pr1nc3,而我对参数化的准备语句一无所知。非常感谢,如果你发现为什么以前的代码不起作用,请随时评论:D。

另一答案

首选方式是绑定。你可以像这样绑定param。你可以参考here

$stmt = $conn -> prepare("SELECT phone, salesRepEmployeeNumber, creditLimit FROM customers WHERE customerNumber = :customernumber");

$stmt->bindParam(':customernumber', $custom_n, PDO::PARAM_INT);

以上是关于连接失败: SQLState:'01000' SQL Server 错误: 53 [Microsoft][ODBC SQL Server Driver][DBNETLIB]Connec的主要内容,如果未能解决你的问题,请参考以下文章

数据源 连接失败

ODBC数据库连接SQL Server失败?啥原因啊!~~

ODBC无法连接SQL SERVER

SQLSTATE [01000]:警告:1265 列的数据被截断

SQLSTATE [01000] SQLDriverConnect:0 [unixODBC] [驱动程序管理器]无法打开库“IBMDB2”:找不到文件

点燃odbc SQLSTATE [01000]错误如何解决?