我正试图绕过MySQli,我对错误报告感到困惑.我使用MySQLi'prepare'语句的返回值来检测执行SQL时的错误,如下所示:
$stmt_test = $mysqliDatabaseConnection->stmt_init();
if($stmt_test->prepare("INSERT INTO testtable VALUES (23,44,56)"))
{
$stmt_test->execute();
$stmt_test->close();
}
else echo("Statement failed: ". $stmt_test->error . "<br>");
Run Code Online (Sandbox Code Playgroud)
但是,prepare语句的返回值是仅检测SQL语句的预处理中是否存在错误而未检测到执行错误?如果是这样,我应该更改我的执行行以标记错误,如下所示:
if($stmt_test->execute()) $errorflag=true;
Run Code Online (Sandbox Code Playgroud)
然后只是为了安全我应该在语句执行后执行以下操作:
if($stmt_test->errno) {$errorflag=true;}
Run Code Online (Sandbox Code Playgroud)
...或者我可以开始使用MySQLi prepare'语句的返回值捕获与它定义的查询的完整执行相关的所有错误?
谢谢C.
在我使用的旧服务器上,我无法使用预准备语句,我目前正在尝试完全转义用户输入,然后再将其发送到MySQL.为此我使用PHP函数mysql_real_escape_string.
由于这个函数没有逃脱MySQL通配符%和_我也用它addcslashes来逃避这些.
当我发送类似的东西:
test_test " '
Run Code Online (Sandbox Code Playgroud)
到数据库然后读回数据库显示:
test\_test " '
Run Code Online (Sandbox Code Playgroud)
看着这个我无法理解为什么_有一个前面的反斜杠但是'和'没有.因为它们全部用\ _确定_'并且"应该都显示相同,即所有都具有转义字符可见或一切都没有可见.
是否会自动筛选转义
有谁能解释一下?
请看下面我的代码.我试图将参数数组绑定到我准备好的语句中.我一直在网上浏览,可以看到我必须使用call_user_func_array,但无法让它工作.我得到的错误是:"第一个参数应该是一个有效的回调,'数组'被给出"我可能是错的,但我假设第一个参数可以是一个数组,也许这个错误信息是误导性的.我认为问题是我的阵列在某种程度上是错误的.谁能看到我做错了什么?谢谢.
$type = array("s", "s");
$param = array("string1","anotherstring");
$stmt = $SQLConnection->prepare("INSERT INTO mytable (comp, addl) VALUES (?,?)");
$params = array_merge($type, $param);
call_user_func_array(array(&$stmt, 'bind_param'), $params);
$SQLConnection->execute();
Run Code Online (Sandbox Code Playgroud) 我一直在看C++ 0x线程并拥有以下代码:
#include <vector>
#include <iostream>
#include <thread>
void TestFunc(const vector<int>& vVec)
{
cout << "in"<<endl;
}
int main()
{
int sizer = 400000000;
vector<int> vTest(sizer);
for(int f=0; f<sizer; f++)
vTest[f] = f;
cout << "V created." << endl;
thread one(TestFunc, vTest);
one.join();
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它只是将向量传递给线程.我不明白的是,在"V created"消息出现后有一个暂停.最初这个(我假设)是被复制用于函数的向量.为了阻止这一点,我通过引用传递,但这没有任何区别.
延迟似乎与向量的大小成正比,这表明它仍在复制(或对数组做一些事情).如果我在没有线程的情况下尝试相同的实验并直接调用该函数,则在传递值时会出现延迟,但在按预期方式通过引用时则不会.
我尝试使用Boost线程而不是C++ 0x(尽管我已经读过它们大致相同)并得到了相同的结果.
这种行为是否有某种原因或者我错过了一些令人眼花缭乱的事情?谢谢.
对不起,发布了错误的测试代码.纠正.编辑:根据要求添加了包含.
编译:g ++ 44 -std = c ++ 0x -lpthread tester.cpp -o test ...因为我在我的Linux(CentOS)附带的标准GNU编译器旁边安装了GNU 4.4,它不支持C++ 11.
我有一个与模板函数和线程有关的问题:
template <class TYPE_size>
void Threader(TYPE_size counter)
{
counter++;
}
int main()
{
unsigned int counter = 100;
thread one(Threader,counter);
one.join();
cout << counter;
}
Run Code Online (Sandbox Code Playgroud)
这不编译; 我明白了:
错误:没有匹配函数来调用âstd:: thread :: thread(,unsigned int&)â
如果我删除它编译的模板,如果我将函数调用更改为标准函数调用而不是线程(仍使用模板),则编译.
有人知道为什么吗?
我正在使用Centos5 64位.
error: no matching function for call to âstd::thread::thread(<unresolved overloaded function type>, unsigned int&)â
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.0/../../../../include/c++/4.4.0/thread:124: note: candidates are: std::thread::thread(std::thread&&)
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.0/../../../../include/c++/4.4.0/thread:122: note: std::thread::thread(const std::thread&)
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.0/../../../../include/c++/4.4.0/thread:121: note: std::thread::thread()
Run Code Online (Sandbox Code Playgroud) 我对与向量有关的内存管理感到非常困惑,可以用一些基本的概念来解释.
我有一个使用大向量的程序.我使用new运算符创建了向量,并在程序结束时使用delete释放它们以获取内存.
我的问题是,如果程序因任何原因崩溃或中止,删除行将被遗漏,是否有办法恢复内存,即使在这种情况下.
我还有一些其他大的向量,我没有new关键字.我已经读过这些将在堆上创建,但无论如何都不需要解除分配,因为内存管理是在"引擎盖下"处理的.但是我不确定是这种情况,因为每次运行我的程序时我都会失去RAM.
所以我的第二个问题是,没有new关键字创建的向量是否真的留给他们自己的设备,并且即使代码在流程中被中止,也可以信任自己清理.
我想刚刚想到的第三个问题是,如果在堆上自动创建了Vectors,你为什么要在它们中使用new关键字呢?谢谢你的阅读,本
我正在学习Boost并且我的make文件出现问题.这是我的基本makefile:
accesstimer: acctime.o btimer.o
g++ acctime.o btimer.o -o accesstimer
acctime.o: acctime.cpp btimer.h
g++ -c acctime.cpp
bentimer.o: btimer.cpp btimer.h
g++ -c btimer.cpp
Run Code Online (Sandbox Code Playgroud)
当acctime.cpp中没有boost文件系统元素时,ake文件工作正常.一旦我添加了boost文件系统元素,我显然需要在make文件中引用boost libray,这是我遇到问题的地方.
以下行适用于单个文件编译:
g++ -I /usr/local/boost/boost_1_39_0 boosttest1.cpp -o bt1 /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试将其集成到make文件中.我根据我在网上找到的信息尝试了很多,但没有一个正在运行这是我最新的:
accesstimer: acctime.o bentimer.o
g++ acctime.o bentimer.o -o accesstimer
acctime.o: acctime.cpp bentimer.h
g++ -c -I /usr/local/boost/boost_1_39_0 acctime.cpp /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a
bentimer.o: bentimer.cpp bentimer.h
g++ -c bentimer.cpp
Run Code Online (Sandbox Code Playgroud)
不幸的是,stlill无法找到Boost库,任何人都可以帮忙吗?谢谢
读过那些已经回答的人的建议我现在得到了这个:
accesstimer: acctime.o bentimer.o
g++ -L /usr/local/boost/boost_1_39_0 acctime.o /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a bentimer.o -o accesstimer
acctime.o: acctime.cpp bentimer.h
g++ -c acctime.cpp
bentimer.o: bentimer.cpp bentimer.h …Run Code Online (Sandbox Code Playgroud) 我需要将值从PHP传递给C++.我想我可以用PHP的passthru()功能.然后我希望C++对该值执行某些操作并将结果返回给PHP.这是我无法解决的问题,有谁知道如何将数据从C++传递到PHP?我宁愿不使用中间文件,因为我认为这会减慢速度.
这可能是一个非常愚蠢的问题......我昨晚开始担心可能会通过浏览器或客户端计算机上的其他方式在服务器上查看PHP文件.我担心的是,我有一个包含数据库用户名和密码的包含文件.如果有办法将此文件的地址放入浏览器或其他系统并查看代码本身,那么出于显而易见的原因,这将是一个问题.
这是一个合理的担忧吗?如果是这样,人们如何防止这种情况?
有谁知道是否可以使用MYSQLI bind_param将NULL插入到列中.
我有一种情况,有时我想在bind_param中将列设置为null.像这样......
$column2 = "NULL";
$insert_data->bind_param('ss', $column1,$column2);
Run Code Online (Sandbox Code Playgroud)
显然,这只是将NULL作为字符串写入列.我尝试过null和\ 0但它们不起作用.
我想知道是否有一些值,我可以使$ column2相等,这将导致它提交和实际的空值而不是.
否则,我将不得不动态构建类型和参数列表,并使用call_user_func_array创建我的绑定,以便在它们为null时不写入列.我可以这样做,但它导致了许多繁琐的额外代码,所以我只是想知道这是否可以避免.谢谢