这不起作用:
$dbh = new PDO("dblib:host=xxxx;dbname=xxx", "xxxxx", "xxxxx");
$sth = $dbh->prepare("{exec wcweb_UserInfo(?)}");
$sth->bindParam(1, $name);
$sth->execute();
while($result = $sth->fetch(PDO::FETCH_ASSOC)) {
var_dump($result);
}
Run Code Online (Sandbox Code Playgroud)
这也行不通:
$dbh = new PDO("dblib:host=xxxxx;dbname=xxxx", "xxxxx", "xxxx");
$sth = $dbh->prepare("{call wcweb_UserInfo(?)}");
$sth->bindParam(1, $name);
$sth->execute();
while($result = $sth->fetch(PDO::FETCH_ASSOC)) {
var_dump($result);
}
Run Code Online (Sandbox Code Playgroud)
这个工作:
$dbh = new PDO("dblib:host=xxxxx;dbname=xxxx", "xxxxx", "xxxx");
$sth = $dbh->prepare("exec wcweb_UserInfo @userid=?");
$sth->bindParam(1, $name);
$sth->execute();
while($result = $sth->fetch(PDO::FETCH_ASSOC)) {
var_dump($result);
}
Run Code Online (Sandbox Code Playgroud)
我尝试了上面使用的2没有大括号的工作,等等.我知道有些人会说,好吧,就像它的工作方式一样吗?..问题是我使用sqlsrv_query库从IIS服务器移植一个正在运行的应用程序到Linux服务器.
应用程序中的所有数据库调用都是使用此方法编写的函数:{call wcweb_UserInfo(?)} ..没有指定任何参数名称,因此我必须修改每个数据库调用以包含参数名称.我的印象是PHP5的PDO库可以做同样的调用吗?
救命!有什么我做错了或只是PDO无法拨打这类电话?
直到现在我都试过了
$sql = "INSERT INTO table-name(col-name) values (cureent_timestamp)";
Run Code Online (Sandbox Code Playgroud)
并将列数据类型设置为datetime,我得到一些值但没有日期或时间.
使用 MySQL 我可以使用
$pdo->setAttribute(PDO::ATTR_TIMEOUT, 5);
Run Code Online (Sandbox Code Playgroud)
设置连接超时值。但是当我使用 sqlsrv 驱动程序时,它的工作方式有所不同。你能解释一下如何用 sqlsrv 设置连接超时吗?
提前致谢。
我们将数据库连接从 ADODB 切换到 SQLSRV,我似乎遇到了问题,导致使用 sqlsrv_fetch_array 出现间歇性延迟。
我在我的数据库中做了一个查询,返回大约 426 行,包含 5 个字段。
代码看起来像这样(为了速度基准测试,我真的删除了它正在做的任何其他事情):
$conn = sqlsrv_connect( $host, array("UID"=>$userName,"PWD"=>$password,"Database"=>$dbName,"QuotedId"=>false, "CharacterSet" =>"UTF-8");
$rsText=sqlsrv_query($conn,$sqlStr,array(),
array(
"Scrollable"=>SQLSRV_CURSOR_STATIC
));
$row = array(1);
while(count($row) != 0){
$row=sqlsrv_fetch_array($rsText,SQLSRV_FETCH_BOTH, SQLSRV_SCROLL_NEXT);
}
Run Code Online (Sandbox Code Playgroud)
使用 ADODB 运行它需要大约 50 毫秒。使用 sqlsrv 运行它需要 500-1000 毫秒。使用 sqlsrv 的原始查询 (sqlsrv_query) 实际上比 ADODB 更快,但是 sqlsrv_fetch_array 存在随机时间延迟(我实际上使用 sqlsrv_fetch 进行了测试,也得到了它们)。我每次调用它都以毫秒为单位计时,虽然每次调用通常是 0-1 毫秒,但有时它会长达 15 毫秒。为什么我说它是随机的,因为如果我多次重新运行代码,延迟不会发生在同一个地方,并且数量会有所不同,所以这不是因为特定行很大(它们都不是) .
有没有人知道我可以看到什么可以做这件事,无论是某个地方的参数还是配置?我认为 ADODB 从不这样做,这与服务器/网络无关。我们使用 PHP 5.6 和 php_sqlsrv_56_ts.dll / php_pdo_sqlsrv_56_ts.dll 和 SQL Server 2008。
谢谢!
我正在使用Windows 10和sql server为我的网站(我使用codeigniter),在Windows这里是我的设置
$db['default'] = array(
'dsn' => '',
'hostname' => '----',
'username' => '--',
'password' => '-----',
'database' => '-----',
'dbdriver' => 'sqlsrv',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);
Run Code Online (Sandbox Code Playgroud)
但现在,我想将我的网站从本地上传到我的服务器.我的服务器使用ubuntu
Distributor ID: Ubuntu
Description: Ubuntu 14.04.4 LTS
Release: 14.04
Codename: trusty
Run Code Online (Sandbox Code Playgroud)
当我上传我的codeigniter时,我收到此错误
Message: …Run Code Online (Sandbox Code Playgroud) 我正在使用 Laravel 和 sqlsrv,连接到 SQL Server 2016 并且一切正常,直到我尝试在插入查询中使用输出子句。
查询是这样的
INSERT INTO TABLE(Columns) OUTPUT INSERTED.MyDesiredReturnColumn VALUES(Value)
Run Code Online (Sandbox Code Playgroud)
这在 SQL Server 中运行良好,并返回所需的值,但使用 Laravel 的 DB::insert 功能它只返回 1(成功插入)
我有一个我现在不想拥有的解决方法,使用 CreatedOn 字段返回最近创建的行,但这有潜在的问题。
更新:我试图检索的字段是在 SQL 中创建的唯一标识符字段 (guid),而不是从 Laravel 端创建
在尝试@PrathameshPalav 的使用 Eloquent 模型创建的建议后,值被正确插入到数据库中,但它仍然没有返回 uniqueidentifier。
$inserted = MyModel::create($information);
print "inserted id is " . $inserted->MyModelId;
Run Code Online (Sandbox Code Playgroud)
这是打印“插入的 id 是”
这是我的模型:
namespace App;
use Illuminate\Database\Eloquent\Model;
class MyModel extends Model
{
//
protected $table = 'MyModelBase';
protected $primaryKey = 'MyModelId';
public $incrementing = false;
protected $keyType = "string";
public $timestamps …Run Code Online (Sandbox Code Playgroud) 所以当我在数据库sqlserver上插入数据时遇到问题。sqlserver拒绝插入id,因为数据库想要自己插入id。
我必须尝试像这样设置 IDENTITY_INSERT ON :
DB::statement('SET IDENTITY_INSERT articles ON;');
并将 IDENTITY_INSERT 设置为 OFF,如下所示:
DB::statement('SET IDENTITY_INSERT articles OFF;');
但这对我的代码不起作用。
public function store(Request $request){
//to sparate to methode
$article = $request->isMethod('put') ? Article::findOrFail($request->article_id) : new Article;
$article->id = $request->input('article_id');
$article->title = $request->input('title');
$article->body = $request->input('body');
DB::statement('SET IDENTITY_INSERT articles ON;');
if($article->save()){
return new ArticleResources($article);
}
DB::statement('SET IDENTITY_INSERT articles OFF;');
}
Run Code Online (Sandbox Code Playgroud)
这个错误看起来像这样:
SQLSTATE[23000]:[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]当 IDENTITY_INSERT 设置为 OFF 时,无法在表“articles”中插入标识列的显式值。
我如何real_escape_string在 sqlsrv 中使用?
这是我的代码:
$uname = sqlsrv_real_escape_string($conn, trim($_POST['uname']));
$pass = sqlsrv_real_escape_string($conn, trim($_POST['pword']));
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
未定义函数
sqlsrv_real_escape_string
我正在尝试将 Laravel 5.6 连接到我的 SQLEXPRESS。
当我尝试将表从 Laravel 迁移到 SQL 时,出现此错误:
SQLSTATE[08001]:[Microsoft][ODBC Driver 13 for SQL Server]TCP 提供程序:无法建立连接,因为目标机器主动拒绝它。(SQL: select * from sysobjects where type = 'U' and name = migrations)
我已经将 sqlsrv extionsion 安装到 php 并对其进行了测试:
<?php
$serverName = "MYNAME\\SQLEXPRESS";
$connectionInfo = array( "Database"=>"Portal", "UID"=>"sa", "PWD"=>"mySecretPwd");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn ) {
echo "Connection established.<br />";
}else{
echo "Connection could not be established.<br />";
die( print_r( sqlsrv_errors(), true));
}
?>
Run Code Online (Sandbox Code Playgroud)
连接成功建立。
我还在 phpinfo(); 中看到了扩展名;
但是如果使用此设置切换到 Laravel 5.6:
我的环境: …
我刚刚购买了运行 Big Sur 11.6 的 M1 Mac mini,我安装了 PHP 7.3、msodbcsql17、mssql-tools、sqlsrv 和 pdo_sqlsrv。
但是当我尝试使用 sqlsrv 连接时,出现以下错误 [Microsoft][ODBC Driver 17 for SQL Server]SSL Provider: [无法加载 OpenSSL 库,请确保安装 OpenSSL 1.0 或 1.1]
我已经通过brew安装了openssl@1.1,我的个人资料包含
export PATH="/opt/homebrew/opt/openssl@1.1/bin:$PATH"
Run Code Online (Sandbox Code Playgroud)
PHP 似乎使用了正确的版本,当打印 echo OPENSSL_VERSION_TEXT 时,它显示 OpenSSL 1.1.1l 24 Aug 2021
我不确定还要尝试什么才能使其发挥作用?